Asp.net mvc 更新模型更改MVC1与MVC3
我正在将一个应用程序从ASP.NET MVC 1转换为MVC 3,但在提交表单时调用Asp.net mvc 更新模型更改MVC1与MVC3,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我正在将一个应用程序从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; }
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);
}
如果我在提交时将子值保留为null,那么在MVC1中它可以正常工作。但是在MVC3中,当我调用UpdateModel(tm)
时,它在returnsubvalue.Value-Age行抛出一个异常
我可以将SubValue.Value
更改为SubValue.GetValueOrDefault()
,但我不想这样做。为什么会在MVC版本之间进行这种更改?如果您的代码在MVC1下工作(我不明白它是如何工作的),那么这纯粹是运气。如果您试图访问像这样的可为null的int的值,它应该抛出一个异常
你的代码坏了,你应该修复它。不要抱怨它曾经起作用,因为如果它起作用,它就不应该起作用。有几件事你可以试试。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);
}
如果要访问该对象的属性,则该对象不能为null。因此,最好的方法是检查对象是否为null,然后尝试访问该属性。
我高度怀疑同样的代码在MVC1中是否可以正常工作(如果它可以正常工作,您在MVC1中得到的值是多少)
在您的情况下,您可以为AgeSub
执行此操作,以避免引发异常
public int AgeSub
{
get
{
return SubValue.HasValue ? SubValue.Value - Age : 0;
}
}
我知道这是一个很老的问题,不过仅供将来参考
在MVC1中,
UpdateModel方法仅更新表单集合中指定的字段
ModelState.IsValid仅检查修改的字段的有效性
在MVC2RC及以上版本中,
现在,Model.IsValid将检查模型中所有属性的有效性,而不仅仅是检查修改后的字段
这意味着,在MVC1中调用ModelState.IsValid时,AgeSub属性未经验证,但在MVC 2及更高版本中调用了该属性
参考:
还要查看MVC2发行说明。哦,对了。当子值为null时,它抛出“可为null的对象必须有一个值”。