2

アップデート

原因はMvcContribの依存関係と.NET4.5Webアプリの競合であると考え、MvcContrib PAの使用を避けようとしたため、それらを使用せずに新しいソリューションを完全に再構築しました(Autofac + MEFで実験しています)。しかし、このソリューションでも、まったく同じエラーが発生しました。私の見解の時点で1行をコメントアウトすると、問題のメソッドはモデルのTitleプロパティの@Html.EditorForであることがわかります。@ Html.TextBoxForに置き換えると、すべてが機能しているように見えます。したがって、これはPAとMvcContribの問題を除外しているようです。何か案が?

元の投稿

いくつかのポータブル領域( http://lostechies.com/erichexter/2009/11/01/asp-net-mvc-portable-areas-via-mvccontrib/)を備えたMVC4Razorアプリで奇妙な問題が発生しています。エリアビューでHTMLヘルパーを使用すると、突然例外がスローされ始めました。例外は次のようなものです。

System.NullReferenceExceptionはユーザーコードによって処理されませんでした
  HResult = -2147467261
  Message=オブジェクト参照がオブジェクトのインスタンスに設定されていません。
  Source = App_Web_field.master.5f132152.8jdnc_7s
  スタックトレース:
       ASP.views_inputbuilders_editortemplates_field_master .__ Render__control1(HtmlTextWriter __w、Control parameterContainer)のhttp://server/Views/InputBuilders/EditorTemplates/Field.Master:line 5
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriterライター、ICollectionの子)で
       System.Web.UI.Control.RenderChildren(HtmlTextWriterライター)で
       System.Web.UI.Control.Render(HtmlTextWriterライター)で
       System.Web.UI.Control.RenderControlInternal(HtmlTextWriterライター、ControlAdapterアダプター)で
       System.Web.UI.Control.RenderControl(HtmlTextWriterライター、ControlAdapterアダプター)で
       System.Web.UI.Control.RenderControl(HtmlTextWriterライター)で
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriterライター、ICollectionの子)で
       System.Web.UI.Control.RenderChildren(HtmlTextWriterライター)で
       System.Web.UI.Page.Render(HtmlTextWriterライター)で
       System.Web.Mvc.ViewPage.Render(HtmlTextWriterライター)で
       System.Web.UI.Control.RenderControlInternal(HtmlTextWriterライター、ControlAdapterアダプター)で
       System.Web.UI.Control.RenderControl(HtmlTextWriterライター、ControlAdapterアダプター)で
       System.Web.UI.Control.RenderControl(HtmlTextWriterライター)で
       System.Web.UI.Page.ProcessRequestMain(ブール値includeStagesBeforeAsyncPoint、ブール値includeStagesAfterAsyncPoint)で
  InnerException:

私の見解に関連するコードは次のとおりです。


@using Cad.Web.Areas.Assets
@model Cad.Web.Areas.Editing.Models.ItemEditModel

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>@StringResources.NewItem</legend>
        @Html.HiddenFor(model => model.Id)
        @Html.HiddenFor(model => model.AuthorId)

        <ol>
            <li>
                @Html.LabelFor(model => model.Title)    
                @Html.EditorFor(model => model.Title)
                @Html.ValidationMessageFor(model => model.Title)
            </li>
            <li>
                @Html.LabelFor(model => model.Description)
                @Html.TextAreaFor(model => model.Description, 4, 60, null)
                @Html.ValidationMessageFor(model => model.Description)
            </li>
        </ol>

        @Html.AntiForgeryToken()
        <input type="submit" value="@StringResources.Create" />
    </fieldset>
}

2つのliの内容をコメントアウトすると、すべてが機能します。コメントを外すと、actionメソッドが結果を返すとすぐに例外が発生します。ビューに渡されるモデルがnullでないことを確認できます。また、 @ Model.Titleを使用して段落を追加することで、エラーなしでそのフィールドにアクセスすることもできます。@Html ...行のいずれかにブレークポイントを設定しようとしましたが、ヒットせず、同じ例外がスローされます。

ビューを含む私のポータブル領域に何か問題があるように見えますが、この例外からは何の手がかりも得られません。これがPAを使用してアーキテクチャ全体を構築するための私の手順です。少なくともこれは私のような初心者(VS2012、C#、MVC4)に役立つ可能性があります。

a)新しい空白のソリューションを作成します。その中で、 PAを保持する新しいクラスライブラリプロジェクトを作成します。NuGetを使用してこのプロジェクトMvcContrib.Mvc3-ciに追加し、 MVCアセンブリへの参照(System.Web.Mvc、System.Web.Routing、System.Web.Razorなど:ホストからすべてのMVC関連の参照をコピーしましたWebプロジェクト-以下の(b)-を参照してください。コントローラ、モデル、およびビューのサブフォルダを使用して、 PAフォルダを作成します。ビューを埋め込みリソースに設定し、次のように、 PortableAreaRegistrationから派生したエリア登録クラスを(PAフォルダーの同じ名前空間に)追加します。

public class EditingAreaRegistration : PortableAreaRegistration
{
    public override string AreaName { get { return "Editing"; } }

    public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
    {
        base.RegisterArea(context, bus);
        context.MapRoute(
            "Editing_default",
            "Editing/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

また、Areasフォルダーに最小限のweb.configを追加します。

<?xml version="1.0"?>
<configuration>
    <system.web>
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
    </system.web>
</configuration>

そして、Viewsフォルダーに_ViewStart.cshtmlを配置します(ホストWebアプリから取得します)。

b)PAプロジェクトと同じMvcContribを参照して、ホストWebアプリケーションを作成します。global.asaxで、 PortableAreaRegistration.RegisterEmbeddedViewEngine()への呼び出しを追加して、次のようにします。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    PortableAreaRegistration.RegisterEmbeddedViewEngine();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    AuthConfig.RegisterAuth();
}

また、このWebアプリケーションに(管理目的で)(移植性のない)領域を追加しました。そこで、Areasフォルダーで、web.configのpages要素にvalidateRequest = "false"(http://www.myclojureadventure.com/2010/06/mvccontrib-portable-areas-part-1.html)があることを確認します。次に、ルートでエリア名を指定でき(もちろん、Resharperなどのツールはビューでエラーを通知しますが、無視しても問題ありません)、ホストWebアプリに物理的に配置されているかのようにPAに移動します。 。

4

1 に答える 1

0

あなたのモデルを見せていただけますか?

モデル フィールドの中に異物はありますか?

モデルがどのように見えるかを知らなくても、これを試すことができます:

    <ol>
        <li>
            @if(Model.Title!=null) {
               @Html.LabelFor(model => model.Title)    
               @Html.EditorFor(model => model.Title)
               @Html.ValidationMessageFor(model => model.Title)
            }
        </li>
        <li>
            @if(Model.Description!=null) {
               @Html.LabelFor(model => model.Description)
               @Html.TextAreaFor(model => model.Description, 4, 60, null)
               @Html.ValidationMessageFor(model => model.Description)
            }
        </li>
    </ol>

オブジェクトが null でないことはわかっていても、ビューはわかりません。たとえば、モデルに外部オブジェクト参照がある場合

public Description Description { get; set; }

それを次のように変更してみてください。

public virtual Description Description { get; set; }

そして何が起こるか見てください。

于 2012-12-17T13:17:13.350 に答える