MVC 3 Kann Zeichenfolge nicht als View-Modell übergeben?

70

Ich habe ein seltsames Problem mit meinem Modell, das an die Ansicht übergeben wurde

Regler

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

Aussicht

@model string

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

Die Fehlermeldung

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

Warum kann ich eine einfache Zeichenfolge nicht als Modell übergeben?

Tony
quelle
1
Warum verwenden Sie diese relativen Pfade? Verwenden Sie dies:View("Sth", null, "abc");
Gdoron unterstützt Monica

Antworten:

117

Ja, Sie können, wenn Sie die richtige Überlastung verwenden :

return View("~/Views/Sth/Sth.cshtml" /* view name*/, 
            null /* master name */,  
            "abc" /* model */);
nemesv
quelle
23
Alternative Lösung:return View("~/Views/Sth/Sth.cshtml", model: "abc")
Fejesjoco
2
Eine andere Lösung: Rückgabe View ("~ / Views / Sth / Sth.cshtml", (Objekt) "abc")
Jas
return View("Sth", model: "abc");
Tharindu Madushanka
92

Wenn Sie benannte Parameter verwenden, können Sie die Notwendigkeit überspringen, den ersten Parameter insgesamt anzugeben

return View(model:"abc");

oder

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

wird auch den Zweck erfüllen.


quelle
18

Du hast diese ViewÜberlastung gemeint :

protected internal ViewResult View(string viewName, Object model)

MVC ist durch diese Überlastung verwirrt:

protected internal ViewResult View(string viewName, string masterName)

Verwenden Sie diese Überladung:

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

Diesen Weg:

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

Übrigens könnten Sie einfach Folgendes verwenden:

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

Überlastungsauflösung auf MSDN

Gdoron unterstützt Monica
quelle
1
Jetzt sehe ich, ich habe den Konstruktor benutztstring viewName, object model
Tony
2
@ Tony. Du meintest wohl methodkeinen Konstruktor. Und die Overload resolutionGot the
false
Selbst das einfache Typisieren des Strings in ein Objekt hätte wahrscheinlich zur Überlastungsauflösung beigetragen: return View("Sth", (object) "abc");Aber das Aufrufen der Methode View(string, string, object)ist in beiden Fällen definitiv klarer.
Owen Blacker
@ OwenBlacker. Ich dachte das gleiche, aber es wird ein Problem verursachen, da die Ansicht ein stringnicht objectals Modell erwartet . es wird also nur die erste Stufe bestehen und dann scheitern.
Gdoron unterstützt Monica
1
@gdoron Ah, das würde Sinn machen. Die Verwendung der View(string, string, object)Überlastung, wie Sie in Ihrer Antwort erwähnt haben, scheint auf jeden Fall The Right Answer ™ zu sein.
Owen Blacker
5

Dies funktioniert auch, wenn Sie für die ersten beiden Parameter null übergeben:

return View(null, null, "abc");
Alex Dresko
quelle
4

Dies funktioniert auch, wenn Sie die Zeichenfolge als Objekt deklarieren:

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

Oder:

return View("abc" as object);
Tim Mac
quelle
3

Du schreibst auch gerne

return View(model: "msg");
Hiren Patel
quelle
0

Dies scheint so offensichtlich zu sein, aber vielleicht braucht jemand in Zukunft mehr Klarheit:

Wenn in Ihrem Controller:

  string id = "abc";
  return View(model: id);

Dann brauchen Sie aus Ihrer Sicht:

@model string

Um den Wert zu erhalten, zum Beispiel:

<div>@Model</div>
Leandro
quelle