我有一个由两个Controller Actions使用的视图。
我的控制器:
AccountController {
...
ActionResult LogOn() {
return View()
}
[HttpPost]
ActionResult LogOn(LogOnModel model) {
return View(model)
}
}
我的观点:
<% if (!String.IsNullOrEmpty(Model.UserName)) { %>
<div class="username"><% Response.Write(Model.UserName); %></div>
<% } %>
当然,上面代码的问题是我在引用 Model.UserName 的行上得到错误“对象引用未设置为对象实例”
支持这两项行动的最佳方式是什么?我可以用以下代码替换HttpGet LogOn方法:
ActionResult LogOn() {
result View(new LogOnModel());
}
虽然有效,但看起来并不优雅,我确信空模型会打破一些我以后需要创建的更复杂的模型。有没有更好的办法?谢谢!
答案 0 :(得分:2)
支持这两项行动的最佳方式是什么?
如果一个视图强烈地键入视图模型(这绝对是你的所有视图应该是什么),你应该确保为这些视图提供服务的所有控制器操作(这几乎都是你应用程序中的所有控制器操作)将视图模型传递给那些视图。
这几乎是bla-bla,它被翻译成源代码,基本上意味着:
ActionResult LogOn() {
return View(new LogOnModel())
}
这有效,但看起来并不优雅,我肯定是空的 model将打破一些我需要创建的更复杂的模型 以后。
这是正确的方法。别担心。你不会打破任何东西。通过不为您的视图提供视图模型,您正在破坏它们。
另外作为旁注,你绝对不应该在视图中使用Response.Write。所以而不是:
<% Response.Write(Model.UserName); %>
你完全想要:
<%= Html.DisplayFor(x => x.UserName) %>
或:
<%: Model.UserName %>
但我个人更喜欢DisplayFor
助手,因为它会处理任何元数据。
答案 1 :(得分:0)
您可以返回不同的视图,也可以返回新模型。
答案 2 :(得分:0)
正如其他评论者所指出的,您的控制器应该支持您的观点的强烈类型。但如果你坚持继续反模式。替换这个:
<% if (!String.IsNullOrEmpty(Model.UserName)) { %>
<div class="username"><% Response.Write(Model.UserName); %></div>
<% } %>
用这个:
<% if (Model!= null && !String.IsNullOrEmpty(Model.UserName)) { %>
<div class="username"><% Response.Write(Model.UserName); %></div>
<% } %>