我有一个模型,其中包含一个订单和订单行。用户可以提交表单,在回发中我们会进行一些行拆分并重建模型和行。问题是隐藏字段根据列表中的索引获取值(看过一些关于此的帖子)
一些代码:
Orderview to display the rows:
@Html.EditorFor(r => r.Rows)
OrderRowModel 的编辑器
@Model.ItemNo @Html.HiddenFor(r => r.Id) @Html.HiddenFor(r => r.RowNumber)
控制器中更新的伪代码
foreach(var r in model.Rows)
{
if(qty>0) {
string errormsg = UpdateRow(r);
if(!string.IsNullOrEmpty(errormsg))
ErrorMsgList.Add(r.RowNo, errormsg);
}
}
var reloadedModel = ReloadOrderAndRows(model.OrderNo);
foreach(var r in reloadedModel.Rows)
{
if(HasError(r.RowNo, ErrorMsgList))
r.Error = GetError(r.RowNo, ErrorMsgList);
}
return View(reloadedModel);
示例 我有一个包含 3 行 (10,20,30) 的订单,用户使用 qty 更新第 20 行并进行回发。我保存了该行,但根据一些业务数据,该行将分为第 20 行和第 21 行在模型中我重新加载整个模型并将其发送到视图视图现在显示 4 行(10、20、21、30)但是21 的隐藏框的 id 为 30(因为 30 之前在列表位置 2 上)。所有数据字段 qty 和 display 字段都是正确的,它是隐藏字段(即使我将其更改为 editorfor 函数)获得了错误的值。
因此,如果再次提交表单,我将更新错误的行。
那么,为什么我在回发后不重定向到原始视图呢?如果更新失败,我会在重新加载的 RowModel 上设置一些数据。如果我进行重定向,我将丢失在行级别设置的所有详细信息。
我需要以某种方式在与行号相关的输入字段上指定唯一 ID,或者让 mvc 忘记它是回发的结果。我看到重新加载的模型具有正确的值。就像有一个视图状态设置了我的值。
*还不能回答我自己的问题,所以我在编辑中回答 *
好的,所以是 ModelState 保存了这些值。如果我只是为 RowNo 做了一个输出,我得到了正确的值,但输入是由模型状态更新的。所以我现在所做的是在返回视图之前调用 ModelState.Clear() 。
我能想到的唯一损失是,如果出错,数量将不会被保存,我可以通过在控制器中为模型设置值来解决这个问题。
ModelState.Clear()