0

特定の場所に発送される注文のリストを表示する ASP.NET MVC ページに問題があります。Orders/DispatchToCentre/22 がデータベースからのセンターの ID であるページが呼び出され、正常に表示されます。

問題は、ページ上の注文の変更をポストバックできるようにしたいので、次のようにしています。

<dl class="orders">
@foreach (OrderViewModel ovm in Model)
{
    <dd>@ovm.User.Name </dd>
    <dt>
    @Html.Partial("OrderTable", ovm)
    <p>
    @using (Html.BeginForm("Dispatch", "Order", new { id = ovm.Id }, FormMethod.Post ) )
    {
       @Html.TextBox("id", ovm.Id );
       @Html.Hidden("OriginatingPage", Request.Path);
       <input type="submit" name="submit-@ovm.Id" value="Order dispatched" />         
    }   
    </p>

    </dt>
}
</dl>

問題は、ページのソースを見ると、次のようになることです。

  <p>
    <form action="/Order/Dispatch/3f180e5b-d112-4245-98ef-602e86eccda6" method="post">
      <input id="id" name="id" type="text" value="2" />
      <input id="OriginatingPage" name="OriginatingPage" type="hidden" value="/Order/DispatchToCentre/2" />       
      <input type="submit" name="submit-3f180e5b-d112-4245-98ef-602e86eccda6" value="Order dispatched" />         
    </form>    
  </p>

入力は、明示的に設定していること (これは Guid である必要があります)idを完全に無視し、OrderViewModel.Id代わりにパスから Center Id を使用するように自動的に設定されているようです。

この少しの干渉する自動魔法を回避するために使用する必要がある構成はありますか、それともここでヘルパーを無視してフィールドを手動で作成するのが最善ですか? 明らかに、後者はかなり些細な作業ですが、Razor レンダリング アクションの重要な側面を概念的に誤解しているのか、それとも単に癖に遭遇したのかを理解しておくと役に立ちます。

4

1 に答える 1

1

コントローラ、HttpGetアクションでは、ビューに戻る前に、を呼び出す必要があります

ModelState.Remove("id");

事実はModelState、モデル自体よりもモデル値を提供することの優先度が高いため、ModelStateからの値がモデル値よりも常に優先されます(存在する場合)。

于 2012-05-01T15:02:50.517 に答える