0

HtmlHelperでの名前のあり方が、モデルのバインドを壊していることを私は知っています。しかし、私はそれを修正する方法を理解していません。または、修正さえあれば。

少し説明。1つのモデルを使用して、テキスト、コントロール、デフォルト値(選択リスト)、および保存された値を入力しています。他のViewModelを使用して、value、dataid、およびctrltypeidのみを返します。コメントアウトされているのは、ポストバックViewModelの入力が解除される原因となっているコード(例:Html.TextBoxFor)です。動作するコード(例:Html.TextBox)は期待どおりに動作します。ですから、コメントされていないコードのように機能させるには、コメントされたコードに対して何をしなければならないのでしょうか。実際に私にできることはありますか?

@model InspectionWebFormsMVC.ViewModels.FormRowModel

@using (Html.BeginForm("Index", "Section", FormMethod.Post))
    {

            <div style="clear:both; padding:1%;">       
                <div class="section">
                    @Model.Section
                </div>
                <div class="number">
                    @Model.SectionNumber
                </div>
                <div class="desc">
                    @Model.Description
                </div>
                <div class="ctrl">               
            @{
        int i = 0;
        //for (int i = 0; i < formRow.RowInput.Count; ++i)
        foreach (var RowInput in Model.RowInput)
        {
            var ddv = new SelectList(RowInput.RowCtrl.DefaultValues, "Value", "Label");
            switch (RowInput.RowCtrl.Type)
            {
                case "dropdown":
                    //@Html.DropDownListFor(blah => RowInput.InputtedData, ddv)
                    //@Html.HiddenFor(blah => RowInput.InputtedDataID)
                    //@Html.HiddenFor(blah => RowInput.RowCtrl.CtrlTypeID)

                                   @Html.DropDownList("InputtedData", ddv)                                   
                                   @Html.Hidden("InputtedDataID", RowInput.InputtedDataID)
                                   @Html.Hidden("CtrlTypeID", RowInput.RowCtrl.CtrlTypeID)
                                   <br /> 
                              break;
                case "text":
                                   //@Html.TextBoxFor(blah => RowInput.InputtedData)
                                   //@Html.HiddenFor(blah => RowInput.InputtedDataID)
                                   //@Html.HiddenFor(blah => RowInput.RowCtrl.CtrlTypeID)

                                   @Html.TextBox("InputtedData", RowInput.InputtedData)
                                   @Html.Hidden("InputtedDataID", RowInput.InputtedDataID)
                                   @Html.Hidden("CtrlTypeID", RowInput.RowCtrl.CtrlTypeID)   
                                   <br /> 
                              break;
            }
        }
        ++i;
                    }

明らかに、ポストバックのビューモデル。

namespace InspectionWebFormsMVC.ViewModels
{
    public class SaveKeyValueInput
    {
        public long InputtedDataID { get; set; }
        public long CtrlTypeID { get; set; }
        public string InputtedData { get; set; }
    }
}

コントローラから。テストに使用されます。

[HttpPost]
    public ActionResult Index(SaveKeyValueInput placeholder)
    {
        var ha = placeholder;
        var la = "Hello";

        FormRowProcessing placeholder2 = new FormRowProcessing();
        var stub = placeholder2.stub()[2];
        return View(stub);
    }
4

1 に答える 1

3

コメント付きのコードを機能させる方法は次のとおりです。

for (int i = 0; i < Model.RowInput.Count; i++)
{
    @Html.DropDownListFor(blah => blah.RowInputpi[i].InputtedData, ddv)
    @Html.HiddenFor(blah => blah.RowInput[i].InputtedDataID)
    @Html.HiddenFor(blah => blah.RowInput[i].RowCtrl.CtrlTypeID)
    ...
}

または、もちろん、この醜いループ (for または foreach) を完全に取り除き、1 行のコードに置き換えることをお勧めします。

@Html.EditorFor(x => x.RowInput)

あとは、対応するエディター テンプレートを定義するだけです (これは、RowInput コレクションの各要素に対してフレームワークによって自動的にレンダリングされるため、ループを記述する必要はありません)。エディター テンプレートは慣習に従って機能します。したがって、RowInputプロパティが次のように定義されている場合:

public IEnumerable<FooBar> RowInput { get; set; }

テンプレートを定義します~/Views/Shared/EditorTemplates/FooBar.cshtml:

@model FooBar

... put your switches and cases and stuff, but I remove this noise to 
... make the answer more readable

@Html.DropDownListFor(blah => blah.InputtedData, ddv)
@Html.HiddenFor(blah => blah.InputtedDataID)
@Html.HiddenFor(blah => blah.RowCtrl.CtrlTypeID)

ただし、フォームにはすべてのレコードが含まれているため、投稿先の対応するコントローラー アクションは、すべてを送信するため、最上位のビュー モデルで動作する必要があります。

[HttpPost]
public ActionResult Index(FormRowModel model)
{
    ...
}
于 2012-07-05T17:53:10.647 に答える