2011-07-08 14 views
6

No puedo obtener una lista de selección para enlazar a mi ViewModel.¿Cómo vincular una lista de selección con viewmodel?

que tienen un modelo de vista que contiene una entidad de preguntas y una cadena

public class QuestionViewModel 
{ 
    public Question Question { get; set; } 
    public string RefUrl { get; set; } 

    public QuestionViewModel() 
    { 
    } 

    public QuestionViewModel(Question question, string RefUrl) 
    { 
     this.Question = question; 
     this.RefUrl = RefUrl; 
    } 

    public QuestionViewModel(Question question) 
    { 
     this.Question = question; 
     this.RefUrl = ""; 
    } 
} 

este es el controlador:

public ActionResult Edit(int id) 
    { 
     Question question = db.Question.Single(q => q.question_id == id); 
     QuestionViewModel qvm = new QuestionViewModel(question); 
     ViewBag.category_id = new SelectList(db.Category, "category_id", "category_name", qvm.Question.category_id); 
     ViewBag.type_code = new SelectList(db.Question_Type, "type_code", "type_description", qvm.Question.type_code); 
     return View(qvm); 
    } 

y el código en mi opinión se ve así:

<div class="editor-label"> 
     @Html.LabelFor(model => model.Question.type_code, "Question_Type") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => Model.Question.Question_Type, (SelectList)ViewBag.type_code) 
     @Html.ValidationMessageFor(model => model.Question.type_code) 
    </div> 

La vista establece el Question_Type de la entidad Question en el valor seleccionado, pero cuando envío el formulario, th e ValidationMessageFor triggers?

+0

Model.Question.Question_Type Model.Question.type_code son 2 propiedades diferentes? tiene un mensaje de validación para Question.type_code, pero está configurando Question_Type? –

Respuesta

14

Lo que tiene es no es una vista modelo. Es una clase híbrida a la que ha llamado , vea el modelo y en la que ha ajustado su entidad de dominio (Question). Eso es malo, no lo hagas.

Esto es lo que te recomendaría. Para empezar, el diseño de un modelo de vista real, que reflejará los requisitos de su punto de vista (de su descripción actual es una lista desplegable que contiene algunos tipos de preguntas y permitiendo al usuario seleccionar algún tipo de pregunta de esta DDL):

public class QuestionViewModel 
{ 
    [DisplayName("Question_Type")] 
    public string SelectedQuestionType { get; set; } 

    public IEnumerable<SelectListItem> QuestionTypes { get; set; } 

    // didn't see where you are using this on your view 
    public string RefUrl { get; set; } 
} 

luego tener su mapa de controlador entre su modelo de dominio y su modelo de vista. Por supuesto una mejora adicional sería utilizar AutoMapper para evitar este mapeo por todas partes sus acciones del controlador:

public ActionResult Edit(int id) 
{ 
    var question = db.Question.Single(q => q.question_id == id); 
    var qvm = new QuestionViewModel 
    { 
     // preselect a value 
     SelectedQuestionType = question.type_code, 
     QuestionTypes = db.Question_Type.Select(x => new SelectListItem 
     { 
      Value = x.type_code, 
      Text = x.type_description 
     }) 
    }; 
    return View(qvm); 
} 

y luego:

<div class="editor-label"> 
    @Html.LabelFor(x => x.SelectedQuestionType) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(
     x => SelectedQuestionType, 
     new SelectList(Model.QuestionTypes, "Value", "Text") 
    ) 
    @Html.ValidationMessageFor(x => x.SelectedQuestionType) 
</div> 

Y una última observación: asegúrese de que ha conseguido librarse de cualquier ViewBag/ViewData fealdad y ponga todo lo que su vista necesite en el modelo de vista. Has mostrado algunas categorías allí en tu acción de controlador que no se materializaron en el fragmento de vista que has mostrado. Si alguna vez los necesita, simplemente colóquelos en su modelo de vista, de la misma manera que lo hicimos con los tipos de preguntas.

+0

Pero tengo que enviar la entidad Pregunta a la Vista para poder editarla? De esta forma solo envía el QuestionViewModel que contiene Question_Type y ref_URL – Nanek

+1

@Nanek, no necesita enviar ninguna entidad Question a su vista. Como dije, todas las propiedades que necesita editar en su vista deben ser parte de su modelo de vista. Luego, su acción de publicación tomará este mismo modelo de vista y lo correlacionará de nuevo al modelo de pregunta de dominio que se enviará al repositorio para su edición o lo que sea necesario. –

+0

@Darin, ¿por qué QuestionTypes es nulo en la publicación? ¿Cómo se vería el método Post? – mcass20

Cuestiones relacionadas