Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 当模型是可选的时,从视图访问模型的最佳方式是什么?_Asp.net Mvc 3 - Fatal编程技术网

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