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 不能将字符串作为视图模型传递?的主要内容,如果未能解决你的问题,请参考以下文章

将模型传递给 ASP.NET Core MVC 中的视图

尝试在 mvc 3 中一次将两个模型传递到同一个视图时出现问题

无法更改 ASP.NET MVC 3 中文本框的值

MVC 4如何将模型属性列表从视图传递给Action

如何将字符串中的加号从视图传递给控制器​​?

MVC4 将模型从视图传递到控制器