1

これが MVC3 の問題である場合は、これに関する投稿があるはずですが、見つかりません。私は何か間違ったことをしているに違いない。for ループを使用してリストを反復処理する単純なビュー (Index.cshtml) があります。各反復で、リスト項目の 1 つからの値を含む 2 つのテキスト入力を出力します。

@{Html.BeginForm();}
@Html.Encode("\n")
@for (int i = 0; i < Model.SortOptions.Count; i++ )
{
    @Html.TextBoxFor(m => m.SortOptions[i].ColumnName);
    @Html.Encode("\n");
    @Html.TextBoxFor(m => m.SortOptions[i].Direction);
    @Html.Encode("\n");
}
<input type="submit" value="Submit" />
@{Html.EndForm();}

ビューには 2 つのコントローラーがあり、1 つは GET 要求用、もう 1 つは POST 用です。POST バージョンは、GET バージョンとは異なる項目をリストに追加します。ここで問題が発生します。ページが再ロードされた後、テキスト ボックスには、ページが GET でロードされたときと同じ値が表示されます。

最初はキャッシュの問題だと思っていましたが、(以下に示すように) コードを変更してテキスト入力を手動で追加し、値を html に挿入すると、新しい値がブラウザーに送信されます。

@{Html.BeginForm();}
@Html.Encode("\n")
@for (int i = 0; i < Model.SortOptions.Count; i++ )
{
    var columnNameName = string.Format("SortOptions[{0}].ColumnName", i);
    var columnNameID = string.Format("SortOptions_{0}__ColumnName", i);
    var directionName = string.Format("SortOptions[{0}].Direction", i);
    var directionID = string.Format("SortOptions_{0}__Direction", i);

<input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" />
<input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" />

}
<input type="submit" value="Submit" />
@{Html.EndForm();}

モデルがビューに送信された時点で期待される値がモデルに含まれていることを確認するために、コードをステップ実行しました。ビュー内のコードをステップ実行して、リストの値を調べました。正しい値を持っているように見えますが、ブラウザーで表示すると、ページが GET 要求に応答したときに対応する値になっています。これはエディタ テンプレートの問題ですか? mvc3 と razor エンジンを使い始めたばかりなので、わからないことがたくさんあります。どんな助けでも大歓迎です。

----- 更新: コントローラーコードを追加 ----

    [HttpGet]
    public ActionResult Index()
    {
        var inv = new InventoryEntities();
        var model = new IndexModel(inv);
        model.SortOptions = new List<SortOption>();
        model.SortOptions.Add(new SortOption { ColumnName = "Model", Direction = SortDirection.Ascending });
        model.SortOptions.Add(new SortOption { ColumnName = "Make", Direction = SortDirection.Ascending });
        //Load data
        model.LoadEquipmentList();

        return View(model);
    }


    [HttpPost]
    [OutputCache(Duration = 1)]
    public ActionResult Index(List<SortOption> sortOptions, SortOption sort)
    {
        var inv = new InventoryEntities();
        var model = new IndexModel(inv);
        ModelState.Remove("SortOptions");
        model.SortOptions = new List<SortOption>();
        model.SortOptions.Add(new SortOption { ColumnName = "Type", Direction = SortDirection.Descending });
        model.SortOptions.Add(new SortOption { ColumnName = "SubType", Direction = SortDirection.Descending });
        model.EquipmentList = new List<EquipmentListItem>();
        model.EquipmentList.Add(new EquipmentListItem { ID = 3, AssignedTo = "Mike", Location = "Home", Make = "Ford", Model = "Pinto", Selected = false, SubType = "Car", Type = "Vehicle" });

        return View(model);
    }
4

2 に答える 2

0

いくつかのことが思い浮かびます-もう少し見ないと言いにくいですが...これらは両方ともそのように書き直すことができます。余分な@記号は必要ありません。

@using(Html.BeginForm()) {
    Html.Encode("\n")
    for (int i = 0; i < Model.SortOptions.Count; i++ ) {
        Html.TextBoxFor(m => m.SortOptions[i].ColumnName);
        Html.Encode("\n");
        Html.TextBoxFor(m => m.SortOptions[i].Direction);
        Html.Encode("\n");
    }
    <input type="submit" value="Submit" />
}


@using (Html.BeginForm()) { 
    Html.Encode("\n");
    for (int i = 0; i < Model.SortOptions.Count; i++ ) {
        var columnNameName = string.Format("SortOptions[{0}].ColumnName", i);
        var columnNameID = string.Format("SortOptions_{0}__ColumnName", i);
        var directionName = string.Format("SortOptions[{0}].Direction", i);
        var directionID = string.Format("SortOptions_{0}__Direction", i);

        <input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" />
        <input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" />

    }
    <input type="submit" value="Submit" />
}

そうでなければ、あなたのものは正しく見え、頭の上から何か間違っていることはわかりません.

于 2011-04-09T01:37:49.070 に答える