2012-04-19 13 views
5

voglio fare qualcosa di simile in modo da poter creare una finestra di dialogo modale che io invoco in ritardo con jQueryCome utilizzare @ Html.EditorFor() senza il modello di vista

<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> 

Su questa linea

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

ottengo l'errore

I modelli possono essere utilizzati solo con l'accesso di campo, l'accesso alle proprietà, matrice monodimensionale i indicizzatore personalizzato ndex o singolo parametro espressioni.

non capisco il motivo per cui si sarebbe preso cura dove o cosa l'istanza è (a patto che il suo tipo di destra)

@ Html.Partial ("~/Vista/comune/EditorTemplates/ViewModel. cshtml ", nuovo ViewModel()) fa il trucco, ma devo dichiarare il percorso completo del modello ... questo fa schifo.

quindi c'è un modo migliore per farlo?

+0

scusate che era un errore di battitura (per proteggere l'innocente) Io modificherò e correggerò. – Peter

+1

Sì ma consumare il modello non è sempre quello che si vuole fare. Le annotazioni di dati sono buone, ci danno valide convalide e nomi carini. Quando voglio fare qualcosa di più ricco con le mie pagine in jQuery è bello solo rendere il viewmodel in un template e lasciare che cose come knockoutjs e twitter-bootstrap facciano la sua magia. – Peter

risposta

12

Tecnicamente non è l'istanza questo è il problema. È un'espressione , non una funzione, che stai passando lì e il parser di espressioni utilizzato da EditorFor, per ottenere i metadati che utilizza per identificare le proprietà ecc., Non supporta le espressioni new.

si può semplicemente dichiarare una nuova istanza del modello al di fuori della dichiarazione EditorFor e fare questo:

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

che dovrebbe funzionare.

Detto questo - non utilizzando l'espressione model nell'espressione è un po 'strano. Dovresti forse prendere in considerazione l'estrazione della finestra di dialogo nella sua vista parziale che ha il ViewModel come tipo di modello, e quindi puoi usare EditorForModel in quello e chiamarlo da questa vista genitore usando un new ViewModel() come modello che passi ad esso.

+0

Sì, ha funzionato, grazie ... e hai ragione a fare delle viste parziali. Sto cercando di farlo accadere ora. – Peter

Problemi correlati