1

ビューにアクセスしようとすると、MVC3 Razor アプリケーション (ASP.NET) で問題が発生する モデルは次のようになります (注釈は削除されています)

namespace MvcTest.Models {
        public class ContactMeModel {
        public string From { get; set; }
        public string Subject { get; set; }
        public string Message { get; set; }
    }
}

ビューには次のようなものがあります(部分的で、エラーが発生する部分を入れるだけで、それを乗り越えることはできません...

@model MvcTest.Models.ContactMeModel
@{
     ViewBag.Title = "test"
}
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <div class="editor-label">
         @Html.LabelFor(model => model.From)
    </div>
}

名前空間は正しいですが、インテリセンスはモデルを認識しないかのようにマークアップの .From 部分に赤を表示しますが、これは機能するビューでも発生します。

ビューにアクセスすると、次のエラーが発生します。

CS1061: 'object' does not contain a definition for 'From' and no extension method 'From' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

(a) Mvc Web プロジェクトには、モデルを含む DLL への参照がある (b) プロジェクト全体がクリーンアップされ、再構築されている (c) ビュー内のモデル参照には、正しい完全修飾モデル名 (d) があるため、これは奇妙です。 ) モデル クラスが存在する (e) そのビューでの実行時を除き、コンパイル エラーはありません。

ちなみに、 @Html.LabelFor がある場所ならどこでもエラーが発生するため、たとえば、在庫の LogOn.cshtml には同じエラーを生成する行があります。

@Html.LabelFor(m => m.UserName)

そして、「インテリセンス」では、ジグザグの赤い線で下線が引かれた「ユーザー名」のテキストが表示され、インテリセンスは同じエラーについて言及しています。しかし、同じページでモデル名に @model 行を重ねて「定義に移動」を実行すると、VS によって定義が表示されます。それで、それはモデルが何であるかを知っていますが、完全ではありません?! モデルの名前空間が正しくない場合、「定義に移動」を選択すると「ナビゲーション」エラーが発生します。

コントローラー アクション メソッドは次のようになります。

    public ActionResult Contact()
    {
        return View(new Coralys.PanamaVibes.Mvc.Models.ContactMeModel());
    }

そうです、匿名型ではなく、正しいモデルを返します。

4

1 に答える 1

6

一日中ネットで調べたり調べたり。古いソリューションと新しいソリューションを比較して、犯人を見つけました。

コンテンツとその他のコード ビハインドの違い以外に判明したように、主な違いは、壊れたソリューションでカスタム webviewpageを実装していたことです。これは悟りの瞬間に私に来ました。それで、次の質問に行き着きました。強く型付けされたビューだけを壊すのに、モデルにナビゲートできるのはなぜですか?

簡単な答えは、カスタム webviewpage は通常のバージョンと汎用バージョンで構成されているということです。ジェネリック バージョンは、厳密に型指定されたビューに使用されます。

@haacked のブログへの投稿から拡張したカスタム webviewpage を調べました。そのブログの最後のコメントの 1 つは、強く型付けされたビューでそれを使用し、同じ問題を経験した人 (マシュー) のものでした。したがって、解決策は、カスタムの非汎用バージョンから継承するのではなく、代わりに WebViewPage から継承するように、カスタム Webviewpage の汎用バージョンを変更することでした。その後、強く型付けされたすべてのビューが再び機能し、CS1061 エラーはなくなりました。

また、@hatchet によるヒントを強くお勧めします。これは、リリース バージョンで BuildViews を有効にするためです (再構築フェーズが長くなるため、デバッグでは有効になりません)。

カスタム WebViewPage の例は、投稿されたとおりに壊れていますが、非常に便利です。Html および Url ヘルパーを過密にすることなく、独自のヘルパーを作成できるようになりました。奇妙なことに、そのような記事を探したところ、MVC3 でカスタム ヘルパーを作成する問題を扱った記事は彼だけでした。

于 2012-05-28T21:55:36.800 に答える