4

インデックスビューがあり、さまざまなフォーミュラの部分ビューを含むフォームを取得しました。

@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で常に空のモデルを取得することです。私は何が間違っているのですか?

4

1 に答える 1

7

私は何が間違っているのですか?

パーシャルを使用しています。パーシャルは、ナビゲーションコンテキストを尊重しません。したがって、生成されたHTMLソースを見ると、次のことがわかります。

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

デフォルトのモデルバインダーで期待される正しいものの代わりに:

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

Step1したがって、このフォームを送信すると、プロパティに適切にバインドされません。明らかに他の複雑なプロパティについても同じことが言えます。

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

したがって、代わりに:

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

使用する:

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

~/Views/SomeController/Step1.cshtml次に、パーシャルをに 移動します~/Views/SomeController/EditorTemlpates/Step1.cshtml

エディターテンプレートを使用せずにパーシャルを保持する場合は、パーシャル内のtemlpateプレフィックスを変更できます。したがって、たとえばStep1.cshtmlパーシャルの中には、次のものを上部に配置できます。

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

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

于 2012-05-10T08:26:35.047 に答える