ビューに渡されるモデルに奇妙な問題があります
コントローラー
[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
モデルとして単純な文字列を渡せないのはなぜですか?
はい、正しい overload を使用している場合は可能です。
return View("~/Views/Sth/Sth.cshtml" /* view name*/,
null /* master name */,
"abc" /* model */);
名前付きパラメーターを使用する場合、最初のパラメーターを完全に指定する必要はありません。
return View(model:"abc");
または
return View(viewName:"~/Views/Sth/Sth.cshtml", model:"abc");
目的にも役立ちます。
この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");
最初の2つのパラメーターにnullを渡す場合にも機能します。
return View(null, null, "abc");
文字列をオブジェクトとして宣言する場合にも機能します:
object str = "abc";
return View(str);
または:
return View("abc" as object);
あなたもこう書いています
return View(model: "msg");