MVC 3 不能将字符串作为视图模型传递?
Posted
技术标签:
【中文标题】MVC 3 不能将字符串作为视图模型传递?【英文标题】:MVC 3 Can't pass string as a View's model? 【发布时间】:2012-04-05 20:23:12 【问题描述】:我的模型传递给视图有一个奇怪的问题
控制器
[Authorize]
public ActionResult Sth()
return View("~/Views/Sth/Sth.cshtml", "abc");
查看
@model string
@
ViewBag.Title = "lorem";
Layout = "~/Views/Shared/Default.cshtml";
错误信息
The view '~/Views/Sth/Sth.cshtml' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Sth/Sth.cshtml
~/Views/Sth/abc.master //string model is threated as a possible Layout's name ?
~/Views/Shared/abc.master
~/Views/Sth/abc.cshtml
~/Views/Sth/abc.vbhtml
~/Views/Shared/abc.cshtml
~/Views/Shared/abc.vbhtml
为什么我不能传递一个简单的字符串作为模型?
【问题讨论】:
你为什么使用这些相对路径?使用这个:View("Sth", null, "abc");
【参考方案1】:
这似乎很明显,但将来可能有人需要更多澄清:
如果在你的控制器中这样做:
string id = "abc";
return View(model: id);
那么在你看来,你需要:
@model string
为了获取值,例如:
<div>@Model</div>
【讨论】:
【参考方案2】:你也写喜欢
return View(model: "msg");
【讨论】:
【参考方案3】:如果你为前两个参数传递 null 也可以:
return View(null, null, "abc");
【讨论】:
【参考方案4】:如果将字符串声明为对象,它也可以:
object str = "abc";
return View(str);
或者:
return View("abc" as object);
【讨论】:
【参考方案5】:如果你使用命名参数,你可以完全跳过第一个参数的需要
return View(model:"abc");
或
return View(viewName:"~/Views/Sth/Sth.cshtml", model:"abc");
也将达到目的。
【讨论】:
【参考方案6】:你的意思是这个View
重载:
protected internal ViewResult View(string viewName, Object model)
MVC 被这个重载弄糊涂了:
protected internal ViewResult View(string viewName, string masterName)
使用这个重载:
protected internal virtual ViewResult View(string viewName, string masterName,
Object model)
这边:
return View("~/Views/Sth/Sth.cshtml", null , "abc");
顺便说一句,你可以用这个:
return View("Sth", null, "abc");
Overload resolution on MSDN
【讨论】:
现在我明白了,我使用的是构造函数string viewName, object model
@Tony。我猜你的意思是method
不是构造函数。而Overload resolution
弄错了方法(为你...)
即使只是将字符串类型转换为对象也可能有助于解决重载问题:return View("Sth", (object) "abc");
,但无论哪种情况,调用方法View(string, string, object)
都绝对更清晰。
@OwenBlacker。我也有同样的想法,但它会导致问题,因为视图期望 string
而不是 object
作为模型。所以它只会通过第一阶段然后失败。
@gdoron 啊,这很有道理。正如您在回答中提到的那样,使用View(string, string, object)
重载肯定看起来像 The Right Answer™,无论如何。【参考方案7】:
是的,如果你使用正确的overload:
return View("~/Views/Sth/Sth.cshtml" /* view name*/,
null /* master name */,
"abc" /* model */);
【讨论】:
替代解决方案:return View("~/Views/Sth/Sth.cshtml", model: "abc")
另一种解决方案:return View("~/Views/Sth/Sth.cshtml", (object)"abc")
return View("Sth", model: "abc");
以上是关于MVC 3 不能将字符串作为视图模型传递?的主要内容,如果未能解决你的问题,请参考以下文章