Reputation: 12705
I have a strange problem with my model passed to the View
Controller
[Authorize]
public ActionResult Sth()
{
return View("~/Views/Sth/Sth.cshtml", "abc");
}
View
@model string
@{
ViewBag.Title = "lorem";
Layout = "~/Views/Shared/Default.cshtml";
}
The error message
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
Why can't I pass a simple string as a model ?
Upvotes: 70
Views: 39177
Reputation: 11588
This seems so pretty obvious but maybe someone needs more clarification in the future:
If in your controller do:
string id = "abc";
return View(model: id);
Then in your view, you need:
@model string
In order to get the value, for e.g.:
<div>@Model</div>
Upvotes: 0
Reputation: 5203
It also works if you pass null for the first two parameters:
return View(null, null, "abc");
Upvotes: 5
Reputation: 1149
It also works if you declare the string as an object:
object str = "abc";
return View(str);
Or:
return View("abc" as object);
Upvotes: 4
Reputation:
If you use named parameters you can skip the need to give the first parameter altogether
return View(model:"abc");
or
return View(viewName:"~/Views/Sth/Sth.cshtml", model:"abc");
will also serve the purpose.
Upvotes: 96
Reputation: 150273
You meant this View
overload:
protected internal ViewResult View(string viewName, Object model)
MVC is confused by this overload:
protected internal ViewResult View(string viewName, string masterName)
Use this overload:
protected internal virtual ViewResult View(string viewName, string masterName,
Object model)
This way:
return View("~/Views/Sth/Sth.cshtml", null , "abc");
By the way, you could just use this:
return View("Sth", null, "abc");
Upvotes: 18