【发布时间】:2011-08-04 13:32:04
【问题描述】:
我一定错过了它的工作原理,因为我无法弄清楚。也许这里有人可以提供帮助。
我的地址对象有一个名为 ValidationStatus 的属性。它在屏幕上不可见,但有一个隐藏字段:
@Html.HiddenFor(model => model.ValidationStatus)
所以,我运行程序,打开一个现有地址,其 ValidationStatus 为“OK”,然后更改地址使其无效。然后我将表单发布到控制器。对象的 Validate 方法调用第 3 方服务,该服务返回错误。代码将 ValidationStatus 设置为“无效”并返回带有验证消息的视图。
当视图加载时,ValidationStatus 被正确设置为“无效”,我可以通过在视图中调试以下语句看到:
@if (Model.ValidationStatus == "Invalid") //show an additional field.
所以我在新字段中输入数据并再次将表单发布到控制器。在控制器的第一行中,我放置了一个断点并在即时窗口中检查 collection["ValidationStatus"]。它是“OK”而不是“Invalid”。
我在这里缺少什么?为什么价值没有坚持?客户端没有任何东西可以改变这个值。
这是控制器代码(非常基本,真的):
[HttpPost]
public ActionResult Index(FormCollection collection, string destinationControllerName)
{
PrepareSecondaryData(); // loads drop-down lists in case the View needs to be returned
try
{
if (!TryUpdateModel(_policy))
return View(_policy);
if (!_services.PolicyEditor.SavePolicy(_policy))
return View(_policy);
}
catch (Exception exp)
{
UIHelper.Log(UIHelper.LogLevel.Error, this, "Error during Save", exp);
ViewBag.Error = UIHelper.GenericErrorMessage();
return View(_policy);
}
return RedirectToAction("Index", destinationControllerName);
}
【问题讨论】:
-
似乎问题出在您的控制器代码中,但如果您不发布它,我无法帮助您。请添加该过程中涉及的所有操作方法和任何私有方法。
-
好的,已添加。我把它省略了,因为里面没有太多东西。 TryUpdateModel() 调用对象的 Validate 方法,该方法完成所有工作。底线是 Validate() 使用新值填充模型的 ValidationStatus,并且由于 TryUpdateModel() 将返回 false,因此 View 将返回给客户端。
-
在您编辑后添加了一个可能太长的答案:)