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?
Oui, vous pouvez si vous utilisez le bon surcharge :
return View("~/Views/Sth/Sth.cshtml" /* view name*/,
null /* master name */,
"abc" /* model */);
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.
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");
Cela fonctionne également si vous passez null pour les deux premiers paramètres:
return View(null, null, "abc");
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);
Vous écrivez aussi comme
return View (modèle: "msg");