我在ASP.NET MVC页面上遇到问题,该页面显示了分派到特定位置的订单列表。该页面名为Orders/DispatchToCentre/2
,其中2是数据库中心的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>
id
输入似乎完全忽略了我明确设置的OrderViewModel.Id
(这应该是Guid)并自动将其自身设置为使用路径中的中心ID。
我是否需要使用一些配置来避免这种干扰自动化,或者我最好只是忽略这里的帮助并手动创建字段?显然,后者是一项相当简单的任务,但理解我是否在概念上误解了Razor渲染动作的一些重要方面或者我只是遇到了一个怪癖会很有帮助。
答案 0 :(得分:1)
在控制器中,HttpGet
操作,在返回视图之前,您应该调用
ModelState.Remove("id");
事实是ModelState
在提供模型值方面比模型本身具有更高的优先级,因此ModelState的值总是优先于模型值(如果有的话)