web-dev-qa-db-fra.com

MVC 3 Vous ne pouvez pas passer de chaîne en tant que modèle de vue?

J'ai un étrange problème avec mon modèle passé à la vue

Contrôleur

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

Voir

@model string

@{
    ViewBag.Title = "lorem";
    Layout = "~/Views/Shared/Default.cshtml";
}

Le message d'erreur

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

Pourquoi ne puis-je pas passer une simple chaîne comme modèle?

63
Tony

Oui, vous pouvez si vous utilisez le bon surcharge :

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

Si vous utilisez des paramètres nommés, vous pouvez ignorer la nécessité de donner le premier paramètre tout à fait

return View(model:"abc");

ou

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

servira également le but.

85
user474407

Vous vouliez dire cette View surcharge:

protected internal ViewResult View(string viewName, Object model)

MVC est confus par cette surcharge:

protected internal ViewResult View(string viewName, string masterName)

Utilisez cette surcharge:

protected internal virtual ViewResult View(string viewName, string masterName,
                                           Object model)

Par ici:

return View("~/Views/Sth/Sth.cshtml", null , "abc");

Au fait, vous pouvez simplement utiliser ceci:

return View("Sth", null, "abc");

Résolution de surcharge sur MSDN

17
gdoron

Cela fonctionne également si vous passez null pour les deux premiers paramètres:

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

Cela fonctionne également si vous déclarez la chaîne en tant qu'objet:

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

Ou:

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

Vous écrivez aussi comme

return View (modèle: "msg");

1
Hiren Patel