Asp.net mvc 3 当模型是可选的时,从视图访问模型的最佳方式是什么?
我有一个由两个控制器操作使用的单一视图 我的控制器:Asp.net mvc 3 当模型是可选的时,从视图访问模型的最佳方式是什么?,asp.net-mvc-3,Asp.net Mvc 3,我有一个由两个控制器操作使用的单一视图 我的控制器: AccountController{ ... ActionResult登录(){ 返回视图() } [HttpPost] ActionResult登录(LogOnModel模型){ 返回视图(模型) } } 我的看法是: 当然,上面代码的问题是,在引用Model.UserName的行上出现了一个错误“objectreference not set to a instance Of a Object” 我认为支持这两种行动的最佳方式是什么
AccountController{
...
ActionResult登录(){
返回视图()
}
[HttpPost]
ActionResult登录(LogOnModel模型){
返回视图(模型)
}
}
我的看法是:
当然,上面代码的问题是,在引用Model.UserName的行上出现了一个错误“objectreference not set to a instance Of a Object”
我认为支持这两种行动的最佳方式是什么?我可以将HttpGet登录方法替换为:
ActionResult登录(){
结果视图(新LogOnModel());
}
这是可行的,但它看起来不是很优雅,我相信一个空模型会破坏一些我以后需要创建的更复杂的模型。有更好的办法吗?谢谢
我认为支持这两种行动的最佳方式是什么
如果视图是视图模型的强类型(这绝对是所有视图都应该是的),那么您应该确保为这些视图服务的所有控制器操作(这几乎是应用程序中的所有控制器操作)都将视图模型传递给这些视图
这相当于bla-bla,它被翻译成源代码,基本上意味着:
ActionResult LogOn() {
return View(new LogOnModel())
}
这是可行的,但它看起来不太优雅,我相信它是空的
模型将打破一些我需要创建的更复杂的模型
后来
这是正确的方法。别担心。你不会弄坏任何东西的。没有为您的视图提供视图模型,您就是在破坏东西
另外,作为旁注,绝对不要使用Response。在视图中书写。因此,不是:
<% Response.Write(Model.UserName); %>
你完全想要:
<%= Html.DisplayFor(x => x.UserName) %>
x.UserName)%%>
或:
但就我个人而言,我更喜欢
DisplayFor
帮助程序,因为它将处理所有元数据。您可以返回不同的视图,也可以返回新的模型。正如其他评论者所指出的,您的控制器应该支持视图的强类型。但如果你坚持反模式。替换此项:
<% 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>
<% } %>
为什么不直接使用Html.DisplayTextFor(model=>model.UserName)??@samack,他不想编辑用户名,所以他不需要编辑器for
,他想显示它,所以他需要DisplayFor
@Darin是的,我意识到并更改了它我使用WebForms多年,知道更新:@parleer你是在使用Web表单还是Razor视图引擎?我已经将代码更新为强类型,但我仍然发现我必须明确使用
,而不是Html.DisplayFor
。这些方法似乎没有足够的表现力来生成我想要的HTML。也许我错过了什么。
<% if (Model!= null && !String.IsNullOrEmpty(Model.UserName)) { %>
<div class="username"><% Response.Write(Model.UserName); %></div>
<% } %>