6

アイテムのリストを表示するASP.NETMVCアプリケーションがあります。ビューページで、アイテムをループして、次のように部分ビューで各アイテムをレンダリングします。

@foreach(var item in Model.items)
{
   <li>
       @Html.Partial("ItemView", item)
   </li>
}

アイテムビューでは、次のように、[削除]ボタンのあるフォームで各アイテムをラップします。

@using(Html.BeginForm(...))
{
    @Html.HiddenFor(m=>m.Id)
    <label>@Model.Name (@Model.Id)</label>
    <input type="submit" value="Delete"/>
}

アイテムは適切にレンダリングされ、結果のページには、適切な名前とIDが表示されたすべてのアイテムの適切なリストが表示されます。

編集:同じことが@Hiddenでも起こります、明らかに、私が以前に書いたものとは反対です。

さらに、これは、フォームが2回目にレンダリングされたとき(つまり、[削除]ボタンの1つがクリックされた後)にのみ発生し、最初はすべてが正常に機能しています。私のアクションメソッドは次のようになります。

public ActionResult AllItems()
{
    var model = new AllItemsModel();
    return PartialView(model);
}

public ActionResult Delete(DeleteModel model)
{
    .... Perform the delete ...
    return PartialView("AllItems", new AllItemsModel());
}

なぜこうなった?

4

1 に答える 1

8

IdRouteDataにすでにパラメータがあるため、これが発生する可能性があります。

public ActionResult SomeAction(int id)
{
    var model = ...
    return View(model);
}

でページをリクエストしました/somecontroller/someaction/123。HiddenForヘルパーは、アイテムのIDではなく、ルート値のIDを使用するようになりました。アイテムビューモデルのプロパティの名前をidとは異なる名前に変更してみてください。たとえばItemId

もう1つの可能性は、ページが最初にレンダリングされたときではなく、ポストバックの後でのみ問題が発生することです。POSTアクションを表示すると、この可能性をさらに調査するのに役立つ場合があります。


アップデート:

さて、POSTアクションを示したので、物事ははるかに明確になります。

public ActionResult Delete(DeleteModel model)
{
    .... Perform the delete ...
    return PartialView("AllItems", new AllItemsModel());
}

基本的に、ここで新しいビューモデルを作成し、それを部分ビューに渡します。ただし、HTMLヘルパーは、バインド時に常にModelStateの値を使用します。その後、ビューモデルからの値。したがって、POSTアクション内でモデルのプロパティを変更する場合は、最初にこの値をModelStateから削除したことを確認してください。あなたの例では、(を作成することによってnew AllItemsModel())ビューモデル全体を完全にスクラッチしたので、ModelState全体をクリアすることができます。

public ActionResult Delete(DeleteModel model)
{
    .... Perform the delete ...

    // Clear the modelstate otherwise the view will use the values that were initially posted
    // and not the values from your view model
    ModelState.Clear();
    return PartialView("AllItems", new AllItemsModel());
}

この動作は仕様によるものであり、HiddenForヘルパーだけでなく、すべてのHTMLヘルパーに適用されます。

于 2012-10-19T09:04:07.177 に答える