我正在将应用程序从ASP.NET MVC 1转换为MVC 3,但在提交表单时调用UpdateModel()
时遇到了一些问题。
这是我的模特课:
public class TestModel
{
public string Name { get; set; }
public string Description { get; set; }
public int Age { get; set; }
public int? SubValue { get; set; }
public int AgeSub
{
get
{
return SubValue.Value - Age;
}
}
}
在我的控制器中:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TestModelSave()
{
TestModel tm = new TestModel();
try
{
UpdateModel(tm);
if (ModelState.IsValid)
{
return RedirectToAction("TestModelEdit");
}
}
catch
{
}
return View("TestModelEdit", tm);
}
如果我在提交时将SubValue保留为null,则在MVC 1中它可以正常工作。但是在MVC 3中,当我调用UpdateModel(tm)
时,它会在TestModel类的行return SubValue.Value - Age;
上抛出异常。
我可以将SubValue.Value
更改为SubValue.GetValueOrDefault()
,但我不想这样做。为什么在MVC版本之间进行了这种更改?
答案 0 :(得分:0)
如果您的代码在MVC1下运行(我无法理解它会如何),那么这只是纯粹的运气。如果你试图像这样访问可空int的值,它应该抛出一个异常。
您的代码已损坏,您应该修复它。不要抱怨它曾经工作,因为如果它曾经,它不应该有。
答案 1 :(得分:0)
你可以试试几件事。您的AgeSub属性应该对子值属性进行空检查:
public int AgeSub
{
get
{
if(SubValue == null)
{
return 0;
}
return SubValue.Value - Age;
}
}
您可以清理控制器操作并删除try catch块,如下所示:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TestModelSave()
{
TestModel tm = new TestModel();
if (ModelState.IsValid)
{
if(TryUpdateModel(tm))
{
return RedirectToAction("TestModelEdit");
}
}
return View("TestModelEdit", tm);
}
答案 2 :(得分:0)
如果要访问该对象的属性,则该对象不能为null。所以最好的办法是检查对象是否为null,然后尝试访问该属性。 我非常怀疑相同的代码在MVC1中没有任何异常(如果它正在工作,你在MVC1中获得的值是什么)
在您的情况下,您可以为AgeSub
执行此操作,以避免抛出异常。
public int AgeSub
{
get
{
return SubValue.HasValue ? SubValue.Value - Age : 0;
}
}
答案 3 :(得分:0)
我知道这是一个非常古老的问题,但仅供将来参考,
在MVC 1中, UpdateModel方法仅更新表单集合中指定的字段 ModelState.IsValid仅检查那些被修改的字段的有效性。
在MVC 2 RC及以上版本中, 现在改变了,Model.IsValid检查模型中所有属性的有效性,而不仅仅是检查修改后的字段。
这意味着,在MVC1中调用ModelState.IsValid时未验证AgeSub属性,但在MVC 2及更高版本中调用
另请查看MVC 2发行说明。