MVC 3 Не можете передать строку как модель представления? - PullRequest
62 голосов
/ 21 марта 2012

У меня странная проблема с моей моделью, переданной в View

Контроллер

[Authorize]
public ActionResult Sth()
{
    return View("~/Views/Sth/Sth.cshtml", "abc");
}

View

@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

Почему я не могу передать простую строку в качестве модели?

Ответы [ 6 ]

110 голосов
/ 21 марта 2012

Да, если вы используете правильную перегрузку :

return View("~/Views/Sth/Sth.cshtml" /* view name*/, 
            null /* master name */,  
            "abc" /* model */);
82 голосов
/ 21 января 2013

Если вы используете именованные параметры, вы можете пропустить необходимость указать первый параметр целиком

return View(model:"abc");

или

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

также послужит цели.

17 голосов
/ 21 марта 2012

Вы имели в виду 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

5 голосов
/ 04 ноября 2013

Это также работает, если вы передаете ноль для первых двух параметров:

return View(null, null, "abc");
4 голосов
/ 07 августа 2013

Это также работает, если вы объявляете строку как объект:

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

Или:

return View("abc" as object);
1 голос
/ 20 марта 2019

Ты тоже пишешь как

Вид возврата (модель: "msg");

...