ASP.NET/ASP.NET Core中的View()与RedirectToAction()

参考

最近才发现的一个问题,工程中有模型Member_MyInfo_ChgPwd_ViewModel,长这样:

其包含了另外两个模型,其中MemberMyInfoViewModel中有一个供DropDownList使用的List<SelectListItem>对象SexList,长这样:

在Controller代码中,有一名为ChgInfo的Action,长这样:还没有实现功能,一开始只是简单的return View(“MyInfo”),引发了空值异常,称没有将SexList实例化,此时才意识到是 return View() 处出了问题,于是换成 return RedirectToAction() 后异常消除。

如果 return View(),则不会生成新的request,仅加载页面的HTML,不会更改浏览器地址框中的URL——ChgInfo收到的由视图传来的Member_MyInfo_ChgPwd_ViewModel的实例form中的SexList并没有实例化,return View()后视图使用的仍然是没有SexList实例的Member_MyInfo_ChgPwd_ViewModel,引发空值异常。

如果 return RedirectToAction(), 则生成新的request,相当于人工访问一次页面——代码从MyInfo这个Action处开始执行,而Myinfo中由Controller传给View的Member_MyInfo_ChgPwd_ViewModel实例是真实new出来的,其SexList已经被实例化,不会引发空值异常。

这两者的区别可以类比python Flask框架中的return xxx()和return redirect(),详见 Python Web Flask框架学习(二) 中的重定向一节。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据