当模型是可选的时,从视图访问模型的最佳方法是什么?

时间:2011-11-28 23:04:25

标签: asp.net-mvc-3

我有一个由两个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()); 
}

虽然有效,但看起来并不优雅,我确信空模型会打破一些我以后需要创建的更复杂的模型。有没有更好的办法?谢谢!

3 个答案:

答案 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>
<% } %>