2010-12-20 18 views
3

Ich verwende MVC 3 w/Razor und mit der neuen dynamischen ViewBag-Eigenschaft. Ich möchte die ViewBag-Eigenschaft mit den EditorFor/LabelFor Html-Helfern verwenden, aber kann die Syntax nicht herausfinden.ASP.Net MVC, dynamische Eigenschaft und EditorFor/LabelFor

Die Ansicht hat ein @model-Set, aber das Objekt, das ich versuche zu verwenden, ist nicht Teil dieses Modells. Ich bin mir bewusst, dass ich ein ViewModel erstellen kann, aber das ist nicht das, wonach ich bin.

Kann jemand helfen?

Controller:

var myModel= _repo.GetModel(id); 
    var newComment = new Comment(); 

    ViewBag.NewComment = newComment; 

    return View(myModel); 

Ausblick:

@model Models.MyModel 

@(Html.EditorFor(ViewBag.NewComment.Comment)) 

Antwort

5

Ich habe es nicht versucht, aber das sollte funktionieren, denke ich.

@(EditorFor(m => ViewBag.NewComment) 

Es ist möglich, eine Linq-to-SQL-Syntax zu verwenden, aber ein ganz anderes Objekt auf der rechten Seite verwenden.

+0

funktioniert das? –

+1

@bahadirarslan Dies funktioniert nicht (Ein Ausdrucksbaum kann keinen dynamischen Ausdruck enthalten). Als eine mögliche Problemumgehung können Sie das dynamische Modell in den zugrunde liegenden Typ umwandeln (siehe meine Antwort für diese Problemumgehung). –

+0

Dies funktioniert auch nicht für benutzerdefinierte Editoren. Zum Beispiel mit einem UIHint wie diesem '[DataType (DataType.Html), UIHint (" tinymce_jquery_full "), AllowHtml]' auf Ihrem Modell. Es ist besser, eine Teilansicht zu erstellen und ein Modellobjekt an sie zu übergeben. –

1

Nicht zu wissen, was Sie Ihren Kommentar Modell aussieht, meine Reaktion aus dem Bauch zu tun wäre, nur:

@Html.EditorFor(ViewBag.NewComment) 

Da jedoch ViewBag ist dynamisch, möglicherweise müssen Sie NewComment vor der Verwendung neu generieren, um das EditorFor-Magazin zu erhalten ic.

@Html.EditorFor(ViewBag.NewComment as Comment) 

aktualisieren

Streik, die EditorFor nur einen Ausdruck als Parameter annehmen können, und dass die Expression muss eine Eigenschaft der Seite Modell zurückzukehren. Ich denke nicht, dass EditorFor oder EditorForModel für Sie von Nutzen sein werden, wenn Sie kein ViewModel verwenden möchten. Haben Sie darüber nachgedacht, die Rollen von dem, für das Sie das Model verwenden, mit dem des ViewBag zu wechseln?

+0

Meinten Sie "Haben Sie darüber nachgedacht, die Rollen von dem zu wechseln, wofür Sie das Model verwenden, mit dem des VIEWMODEL"? Ansonsten bin ich mir nicht sicher, was du meinst. –

+0

Hallo, ich meine EditorFor scheint für die Verwendung mit dem Modell der Seite ausgerichtet zu sein. Es ist sicherlich die Art, wie ich sie immer benutzt habe. Aber ich kann Verdienste in dem, was Sie erreichen wollen, sehen. Was ich meine ist, dass Sie derzeit ein Modell aus Ihrem Repository dem Seitenmodell zuweisen. Was, wenn Sie das Repo-Modell dem ViewBag und dem Kommentar zum Seitenmodell zugewiesen haben? Ist das in deinem View möglich? Können Sie näher erläutern, warum Sie ein ViewModel nicht verwenden möchten? – kim3er

+0

Ich habe mehrere Modelle, die ich auf der Seite verwende, also kann ich nicht einfach eines für das andere tauschen. Was frustrierend ist, denke ich, dass es möglich ist (oder sein sollte), einfach die Syntax nicht kennen. –

1

Wenn ich aus irgendeinem Grund ViewData verwenden muss, um das Modell in meine Ansicht zu übergeben, mache ich Folgendes, um die Html.DisplayFor() - Helfer zu ermöglichen.

in dem Ansichten Codeblock gegossen I das Viewdata-Modell-Objekt zu seinem zugrunde liegenden Typ

var newCommentModel = (NewComment)ViewBag.NewComment; 

Dann weisen I den folgenden Ausdruck zum helper

@Html.DisplayFor(model => newCommentModel) 

der Ausdruck der stark typisierte Referenz verwendet Baum enthält jetzt ein stark typisiertes Modell und das DisplayTemplate wird korrekt angezeigt.