MVC 3无法将字符串作为View的模型传递?


70

我的模型传递给View时遇到一个奇怪的问题

控制者

[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

为什么不能将简单的字符串作为模型传递?


1
为什么要使用这些相对路径?使用这个:View("Sth", null, "abc");
gdoron支持Monica 2012年

Answers:


117

是的,如果您使用正确的重载,则可以

return View("~/Views/Sth/Sth.cshtml" /* view name*/, 
            null /* master name */,  
            "abc" /* model */);

23
替代解决方案:return View("~/Views/Sth/Sth.cshtml", model: "abc")
fejesjoco 2014年

2
另一个解决方案:return View(“〜/ Views / Sth / Sth.cshtml”,(object)“ abc”)
Jas

return View("Sth", model: "abc");
Tharindu Madushanka,

92

如果使用命名参数,则可以完全省略第一个参数

return View(model:"abc");

要么

return View(viewName:"~/Views/Sth/Sth.cshtml", model:"abc");

也将达到目的。


18

您的意思是这个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");

MSDN上的重载解析


1
现在我知道,我正在使用构造器string viewName, object model
Tony

2
@托尼 你的意思method不是我想的构造函数。还有Overload resolution错误的方法(适合您...)
gdoron支持Monica 2012年

即使只是将字符串类型转换为对象,也可能有助于解决重载问题:return View("Sth", (object) "abc");,但View(string, string, object)无论哪种情况,调用该方法绝对更加清晰。
Owen Blacker

@OwenBlacker。我以为是同一件事,但是会导致问题,因为视图期望string不是object模型。因此它只会通过第一阶段,然后失败。
gdoron支持Monica's 2012年

1
@gdoron啊,那很有道理。View(string, string, object)就像您在答案中提到的那样,无论如何,使用过载似乎都像是正确的答案™。
Owen Blacker


4

如果将字符串声明为对象,它也可以工作:

object str = "abc";
return View(str);

要么:

return View("abc" as object);


0

这似乎很明显,但将来也许有人需要进一步澄清:

如果在您的控制器中执行以下操作:

  string id = "abc";
  return View(model: id);

然后在您看来,您需要:

@model string

为了获得该值,例如:

<div>@Model</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.