2 Stimmen

Starke Typisierung der Methode ASP.NET Controller.View() für den Modelltyp

Es gibt keine stark typisierte View()-Methode, die ein ActionResult zurückgibt. Nehmen wir also an, ich habe

class Edit : ViewPage<Frob>

In meinem FrobController werde ich etwas tun wie "return View("Edit", someFrob);". Hier findet keine Überprüfung statt, so dass ich die Verwendung von View und Controller immer manuell synchronisieren muss. Das ist suboptimal, und mir sind keine eingebauten Lösungen bekannt.

Ich habe diese Methode zu meiner Controller-Basisklasse hinzugefügt:

public ActionResult ViewPage<V, M>(V view, M model)
    where V : ViewPage<M>
    where M : class {
    return View(typeof(V).Name, model);
}

Anmerkung: Der Grund, warum ich einen Standpunkt vertrete Objekt, das nie verwendet wird, ist, weil, AFAIK, gibt es keine Möglichkeit, C#s Typ Inferenz anders funktioniert. Wenn ich den View-Parameter entfernen würde, müsste ich V explizit angeben, was auch bedeutet bedeutet, M explizit zu spezifizieren... seufz.

Jetzt kann ich das also tun:

  return ViewPage(new Views.Frob.Edit(), myFrob);

Ich gebe die genaue Ansicht an (kein Problem, wenn sie umbenannt wird), und myFrob wird auf den richtigen Modelltyp geprüft. Der Nachteil ist, dass ich einen neuen Edit einfüge. Alternativ könnte ich auch schreiben:

  return ViewPage((Views.Frob.Edit)null, myFrob);

Ein Nachteil ist, dass das Modell genau übereinstimmen muss. Mit einer ViewPage> kann ich also keine Liste einfügen. Ich dachte, dies könnte funktionieren:

    public ActionResult ViewPage<V, M, T>(V view, T model)
        where V : ViewPage<M>
        where M : class 
        where T : M {
        return View(typeof(V).Name, model);
    }

Aber die Typinferenz von C# kann das nicht herausfinden. Das andere potenzielle Problem ist, dass der Name des Ansichtstyps möglicherweise nicht der richtige Name ist, da ich denke, dass er durch Attribute überschrieben werden kann. Aber das ist eine einfache Lösung, wenn ich darauf stoße.

Fragen:

  1. Wie kann ich diese Syntax sauberer gestalten?
  2. Welche Nachteile übersehe ich hier?

Edit: Was die Kenntnis des Controllers über den View betrifft, so ist sie nur geringfügig. Das einzige, was er von der View erhält, ist der Type, für den er den Namen abgreift. Das ist also gleichbedeutend mit der Übergabe des Strings name. Und das stark typisierte Modell, das übereinstimmen muss, sonst schlägt es fehl. Es weiß also nicht wirklich viel über den View - es ist nur ein Trick, um den Compiler dazu zu bringen, Fehler abzufangen.

3voto

Craig Stuntz Punkte 124703

Das erste Problem, das ich sehe, ist, dass Sie Ihren Controller jetzt auf die Ansicht aufmerksam gemacht haben. Das ist eine Grenze, die Sie niemals überschreiten sollten.

3voto

Roberto Barros Punkte 1481

Schauen Sie sich dieses Beispiel an: http://oddiandeveloper.blogspot.com/2008/11/strongly-typed-view-names.html

Sie können Ihre Ansicht wie folgt aufrufen:

return View(typeof(Views.en.Home.about), AboutModel);

0voto

Mike Glenn Punkte 3039

Ich frage mich immer noch, was Sie damit erreichen wollen, was nicht heißt, dass Sie Unrecht haben. Ayende macht das Gleiche fast täglich mit mir :-) Wie auch immer, die sauberste Syntax, die mir einfiel, ist diese:

public ActionResult Test() {
    return View<Views.Module1.Test, string>("Hello All");
}

protected ActionResult View<TView, TModel>(TModel model)
    where TView : ViewPage<TModel>
    where TModel : class {
        return View(typeof(TView).Name, model);
}

Sie opfern die Typinferenz, erhalten aber die vollständige Kompilierzeit-Typüberprüfung und müssen kein unbenutztes Objekt neu erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X