2011-02-01 1 views
0

私は、非常に単純なASP.NET MVC Createメソッドでなければならないものに問題があります。HttpPost CreateのASP.NET MVCエラー - POST後にモデルに渡されたNULL値 - モデルバインディングの問題?

データを入力して作成ビューでフォームを送信すると(すべての検証ルールが渡された)、POSTメソッドに渡されたモデルのインスタンスには、各フィールドおよびModelState.IsValidにnull値または0値が含まれます。 falseを返します。

私はFirebugを使用してPOSTフォームのパラメータをチェックしています。送信アクションで明らかにフィールドのすべてのパラメータが投稿されています。ただし、これらのパラメータは、コントローラのPOSTメソッドに渡されるモデルにはバインドされないため、モデル(つまり、コード内の素材)には、すべてのフィールドにNULL値が含まれます(POSTの開始時に配置されるウォッチポイントとブレークポイントを使用してチェックされます方法)。 Firebugのから

POSTパラメータ:コントローラーのCreateの

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Database.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcDeepaWebApp.ViewModels.DatabaseSimpleMaterialViewModel>" %> 
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
     <% Html.EnableClientValidation(); %> 
     <% using (Html.BeginForm()) 
      {%> 
     <%: Html.ValidationSummary(true) %> 
     <fieldset> 
      <legend>Create MaterialNoMass</legend> 
      <%: Html.EditorFor(model => model.MaterialNoMass, new { RoughnessTypes = Model.RoughnessTypes })%> 
      <p> 
       <input type="submit" value="Save" /> 
      </p> 
     </fieldset> 
     <% } %> 
     <div> 
      <%: Html.ActionLink("Back to List", "Index") %> 
     </div> 
    </asp:Content> 

GETとPOSTメソッド:FYI

// 
    // GET: /DatabaseSimpleMaterial/Create 
    public ActionResult Create() 
    { 
     var viewModel = new DatabaseSimpleMaterialViewModel 
     { 
      MaterialNoMass = new MaterialNoMass(), 
      RoughnessTypes = deepaDB.RoughnessTypes.ToList() 
     }; 

     return View(viewModel); 
    } 

    // 
    // POST: /DatabaseSimpleMaterial/Create 

    [HttpPost] 
    public ActionResult Create(MaterialNoMass material) 
    { 
     if (ModelState.IsValid) 
     { 
      MaterialAllType mt = new MaterialAllType(); 
      mt.MatID = material.MaterialNoMassID; 
      mt.MatTypeID = deepaDB.MaterialTypes.Single(type => type.MatType == "SimpleMaterial").MatTypeID; 
      material.MatTypeID = mt.MatTypeID; 

      deepaDB.AddToMaterialAllTypes(mt); 

      deepaDB.AddToMaterialNoMasses(material); 

      deepaDB.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     //Error occurred 
     var viewModel = new DatabaseSimpleMaterialViewModel 
     { 
      MaterialNoMass = material, 
      RoughnessTypes = deepaDB.RoughnessTypes.ToList() 
     }; 

     return View(viewModel); 
    } 

、新しいMaterialNoMassが作成されるたびに

Content-Type: application/x-www-form-urlencoded Content-Length: 228 MaterialNoMass.MaterialNoMassID=9mmPlasterboard&MaterialNoMass.RoughnessTypeID=3&MaterialNoMass.Resistance=0.0560&MaterialNoMass.ThermalAbsorptance=0.09&MaterialNoMass.SolarAbsorptance=0.07&MaterialNoMass.VisibleAbsorptance=0.07 

は、ビューの作成しますMaterialNoMassと同じIDを使用して、MaterialAllTypeの新しいインスタンスも作成する必要があります。モデルのバインディングが機能していないと思われるので、私はまだデータベースを変更する段階に達していません。

私は、アプリケーション内の他のコントローラで同様の作成方法を使用しましたが、これらはすべてこのコントローラ以外は正常に動作します。私は過去2日間、これをデバッグするのに苦労してきました。助けてください!

答えて

1

この問題は、ビューに渡すモデルがDatabaseSimpleMaterialViewModelで、予想されるPOSTアクション内にあるという事実に由来します。MaterialNoMass。だから、あなたが正しい接頭辞を使用します

[HttpPost] 
public ActionResult Create([Bind(Prefix="MaterialNoMass")]MaterialNoMass material) 

私はあなたのエディタのテンプレートは、このようなフィールドを生成しているとします

<input type="text" name="MaterialNoMass.MaterialNoMassID" value="" /> 
<input type="text" name="MaterialNoMass.RoughnessTypeID" value="" /> 
... 

だからあなたは、このような接頭辞があることをモデルバインダーを指定する必要があります。

+0

ありがとうございました!できます!なぜ私は、(ドロップダウンリストを設定するために)GETでViewModelsを渡し、POSTアクションのパラメータとしてのみモデルクラスを使用する他のコントローラでバインドプレフィックスを設定しないと逃げることができないのだろうかと思います。 – fsalim

関連する問題