web-dev-qa-db-ja.com

MVC 3ビューのモデルとして文字列を渡すことはできませんか?

ビューに渡されるモデルに奇妙な問題があります

コントローラー

[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

モデルとして単純な文字列を渡せないのはなぜですか?

63
Tony

はい、正しい overload を使用している場合は可能です。

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

名前付きパラメーターを使用する場合、最初のパラメーターを完全に指定する必要はありません。

return View(model:"abc");

または

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

目的にも役立ちます。

85
user474407

この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のオーバーロード解決

17
gdoron

最初の2つのパラメーターにnullを渡す場合にも機能します。

return View(null, null, "abc");
5
Alex Dresko

文字列をオブジェクトとして宣言する場合にも機能します:

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

または:

return View("abc" as object);
4
Tim Mac

あなたもこう書いています

return View(model: "msg");

1
Hiren Patel