2012-04-19 7 views
5

ich so etwas wie dies tun will, so kann ich einen modalen Dialog erstellen, die ich mit jQuery spät berufen würdeSo verwendet @ Html.EditorFor() ohne die Ansicht Modell

<div class="modal" id="modalName" style="display: none;"> 
<div class="modal-header"> 
    <a class="close" data-dismiss="modal">×</a> 
    <h3>Edit Contacts</h3> 
</div> 
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new Dictionary<string, object> { { "class", "form-horizontal" } })) 
{ 
    <div class="modal-body"> 
    @Html.EditorFor(model => new ViewModel(), "ViewModelTemplateName") 
    </div> 
    <div class="modal-footer"> 
     <a href="#" class="btn" data-dismiss="modal">Close</a> 
     <button type="submit" class="btn btn-primary"> 
      Submit</button> 

    </div> 
} 
</div> 

Auf dieser Linie

@Html.EditorFor(model => new ViewModel(), "ViewModelTemplateName") 

ich erhalte den Fehler

Vorlagen können nur mit Feldzugriff, Zugriff auf Eigenschaften, eindimensionales Array verwendet werden i ndex oder benutzerdefinierter Indexer für einzelne Parameter Ausdrücke.

Ich verstehe nicht, warum wäre es egal, wo oder was die Instanz (solange sie die richtige Art)

@ Html.Partial ("~/Ansichten/Shared/EditorTemplates/Ansichtsmodell. cshtml ", neue ViewModel()) macht den Trick, aber ich muss den vollständigen Pfad der Vorlage deklarieren ... das ist ein bisschen nervtötend.

also gibt es einen besseren Weg, es zu tun?

+0

Entschuldigung das war ein Tippfehler (um die Unschuldigen zu schützen) Ich werde bearbeiten und reparieren. – Peter

+1

Ja, aber das Modell zu konsumieren ist nicht immer das, was Sie tun möchten. Datenanmerkungen sind gut, sie geben uns schöne Validierungen und schöne Namen. Wenn ich etwas reicher mit meinen Seiten in jQuery machen möchte, dann ist es schön, das Viewmodel in eine Vorlage zu rendern und diese Dinge wie knockoutjs und twitter-bootstrap magisch wirken zu lassen. – Peter

Antwort

12

Technisch ist es nicht die Instanz, die das Problem ist. Es ist ein Ausdruck, keine Funktion, die Sie dort übergeben und der Ausdruck Parser von EditorFor verwendet, um die Metadaten zur Identifizierung der Eigenschaften usw. zu erhalten, unterstützt keine new Ausdrücke.

Sie können einfach eine neue Instanz des Modells außerhalb der EditorFor Aussage erklären und dies tun:

@{ var emptyViewModel = new ViewModel(); } 
@Html.EditorFor(model => emptyViewModel, "ViewModelTemplateName") 

Das sollte funktionieren.

Das sagte - nicht mit einem Teil der model in der Ausdruck ist ein wenig seltsam. Sie sollten vielleicht erwägen, den Dialog in seine eigene Teilansicht zu extrahieren, die ViewModel als Modelltyp hat, und dann können Sie EditorForModel darin verwenden, und rufen Sie es aus dieser übergeordneten Ansicht mit einem new ViewModel() als das Modell, das Sie übergeben.

+0

Ja, das hat funktioniert, danke ... und Sie haben recht, wenn Sie Teilansichten machen. Ich versuche, das jetzt zu ermöglichen. – Peter