2012-04-19 20 views
5

que quiero hacer algo como esto para que pueda crear un cuadro de diálogo modal que yo invoco tarde con jQueryCómo utilizar @ Html.EditorFor() sin el modelo de 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> 

En esta línea

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

me sale el error

las plantillas se pueden utilizar solamente con el acceso de campo, acceso a la propiedad, matriz unidimensional i ndex, o expresiones individuales de indexador de un solo parámetro .

No entiendo por qué le importaría dónde o lo que es la instancia (siempre que su tipo derecha)

@ Html.Partial ("~/Views/Shared/EditorTemplates/modelo de vista. cshtml ", nuevo ViewModel()) hace el truco, pero tengo que declarar la ruta completa de la plantilla ... esto apesta un poco.

¿Hay alguna forma mejor de hacerlo?

+0

disculpa que fue un error tipográfico (para proteger a los inocentes) voy a editar y corregir. – Peter

+1

Sí, pero consumir el modelo no siempre es lo que quiere hacer. Las anotaciones de datos son buenas, nos dan bonitas validaciones y nombres bonitos. Cuando quiero hacer algo más rico con mis páginas en jQuery, es bueno simplemente renderizar el modelo de vista en una plantilla y dejar que cosas como knockoutjs y twitter-bootstrap hagan su magia. – Peter

Respuesta

12

Técnicamente no es la instancia ese es el problema. Es una expresión , no es una función que está pasando allí y el analizador de expresiones utilizado por EditorFor, para obtener los metadatos que utiliza para identificar las propiedades, etc., no admite las expresiones new.

puede simplemente declarar una nueva instancia del modelo fuera de la declaración EditorFor y hacer esto:

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

que debería funcionar.

Dicho esto - no usando parte de model en la expresión es un poco raro. Quizás debería considerar extraer el diálogo en su propia vista parcial que tiene ViewModel ya que es el tipo de modelo, y luego puede usar EditorForModel en eso, y llamarlo desde esta vista principal usando new ViewModel() como el modelo que le pasa.

+0

Sí, eso funcionó, gracias ... y tienes razón en hacer vistas parciales. Estoy buscando hacer que eso suceda ahora. – Peter

Cuestiones relacionadas