我正在使用ASP.NET MVC 2,这就是问题所在。我的视图模型看起来像这样。它包括由用户编辑的一些字段以及用于显示目的的其他字段。这是一个简单的版本
public class MyModel
{
public decimal Price { get; set; } // for view purpose only
[Required(ErrorMessage="Name Required")]
public string Name { get; set; }
}
控制器看起来像这样:
public ActionResult Start(MyModel rec)
{
if (ModelState.IsValid)
{
Repository.SaveModel(rec);
return RedirectToAction("NextPage");
}
else
{
// validation error
return View(rec);
}
}
问题是当出现验证错误并且我调用View(rec)时,我不确定使用仅显示的值填充视图模型的最佳方法。
旧方式这样做,我传入一个表单集合,我会做这样的事情:
public ActionResult Start(FormCollection collection)
{
var rec = Repository.LoadModel();
UpdateModel(rec);
if (ModelState.IsValid)
{
Repository.SaveModel(rec);
return RedirectToAction("NextPage");
}
else
{
// validation error
return View(rec);
}
}
但是这样做,我在UpdateModel(rec)
上收到错误:无法更新“MyModel”类型的模型。
有什么想法吗?
答案 0 :(得分:2)
我想出了这个。如果您调用UpdateModel
并且存在验证错误,则会抛出异常。解决这个问题的方法是调用TryUpdateModel
。
答案 1 :(得分:0)
您的价格会员制定者(可能)不应公开,您可能需要考虑从模型中存储的价格加载价格。
另一件事是渲染视图时不会使用文本框(或其他输入类型)渲染Price。
public class MyModel
{
public decimal Price
{
get
{
return //get the value from something
}
} // for view purpose only
[Required(ErrorMessage="Name Required")]
public string Name { get; set; }
}
答案 2 :(得分:0)
如果你使用强类型视图,这应该是开箱即用的:
ViewPage<MyModel>
您的字段应显示为:
<%= Html.TextBoxFor(m => m.Name) %>
无论如何,您不应在可编辑字段中显示只读属性。当您重新显示无效视图并在控制器操作中提供传入的模型对象实例时,应按预期在文本框(或仅字符串容器)中填充值。
我不认为你应该以这种方式对Price属性有任何问题,但以防你是否尝试过使用这个控制器动作声明:
public ActionResult Start([Bind(Exclude = "Price")]MyModel rec)
{
// ...
}