2012-05-10 12 views
4

私はインデックスビューを持っています。ここでは、別のフォーミュラの部分ビューを含むフォームがあります。私のコントローラでASP.NET MVC 3でモデルが渡されない

@Html.ValidationSummary(true, "Beheben Sie die Fehler, und wiederholen Sie den Vorgang.") 
@using (Html.BeginForm()) 
{ 
object mod = null; 
switch (Model.Step) 
{ 
    case 1: 
     Html.RenderPartial("Step1", Model.Step1); 
     break; 
    case 2: 
     Html.RenderPartial("Step2", Model.Step2); 
     break; 
    default: 
     Html.RenderPartial("Step0"); 
     break; 
} 

<p> 
    @if (Model.Step > 100000) 
    { 
     <button name="button" value="Zurück" /> 
    } 
    @if (Model.Step != 0) 
    {  
     <input type="submit" name="submit" value="Zurück" /> <input type="submit" name="submit" 
      value="Weiter" id="Weiter" /> <input type="submit" name="submit" value="Abbrechen" /> 
    } 
</p> 
} 

私はこのようなものだ:

[HttpPost] 
public ActionResult Index(InputModel model, string submit, HttpPostedFileBase file) 
{ 
    if (String.IsNullOrEmpty(submit)) 
     submit = ""; 
    if (submit == "Weiter") 
     model.Step++; 

    if (submit == "Zurück") 
     model.Step--; 

をInputModelは、このようないくつかの「サブモデル」を持っている:

に部分図に渡され
public Step1Model Step1 { get; set; } 

public Step2Model Step2 { get; set; } 

public Step3Model Step3 { get; set; } 

それらを埋める。 問題は今私のコントローラのHttpPostに空のモデルが常にあることです。 私は何が間違っていますか?

+1

生成されたHTMLコードの入力ボックスの名前を見てください。彼らは間違っているはずです。あなたの行動は "Step1Model_Property"のようなものを期待しています。正しい名前を取得する方法の詳細については、http://msdn.microsoft.com/en-us/library/ee407414.aspx – ChrisB

+0

@ChrisBに同意します。あなたは 'Html.EditorFor(Model.Step1)'を使うべきです。 'Step1Model'等のためのエディタテンプレートを追加してください。これは命名の世話をします。 'RenderPartial'を使用している場合は、MVCが入力の名前を正しく保持するために必要なメタデータを送信するのが難しいです。 –

答えて

7

私は間違っていますか?

パーシャルを使用しています。部分はナビゲーションの文脈を尊重しません。代わりに、デフォルトのモデルバインダーによって期待されている正しいものの

<input type="text" name="SomeProperty" value="some value" /> 

:あなたが生成されたHTMLソースを見るとだからあなたは次のように表示されますこのフォームを送信するので、

<input type="text" name="Step1.SomeProperty" value="some value" /> 

ますがStep1プロパティに正しくバインドされていません。明らかに他の複雑なプロパティについても同じ注意が必要です。

1つの可能性は、ナビゲーションコンテキストを保持し、入力フィールドの適切な名前を生成するため、部分テンプレートの代わりにエディタテンプレートを使用することです。

ので、代わりの:

Html.RenderPartial("Step1", Model.Step1); 

使用:

@Html.EditorFor(x => x.Step1, "Step1") 

、その後は~/Views/SomeController/EditorTemlpates/Step1.cshtmlにご~/Views/SomeController/Step1.cshtml部分を移動します。

エディターテンプレートを使用せずに部分文字列を保持したい場合は、部分文字列内のテンプレートを変更することができます。だから、部分的Step1.cshtml内側たとえば、あなたがトップで次のように置くことができる:あなたが点検したときに

@{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Step1"; 
} 

は、今すぐあなたの生成されたHTMLソース固有名詞は、入力フィールドのために放出されるべきです。個人的には、プレフィックスのハードコーディングを避け、エディタテンプレートと比較して部分的な再利用が少なくなるように、エディタテンプレートのアプローチをお勧めします。

+0

ありがとう、たくさんの助けになりました! –

関連する問題