2012-05-18 20 views
11

tengo una vista MVC¿Cómo marco las casillas de verificación en los miembros del modelo MVC?

<%@ Page Language="C#" MasterPageFile="PathToMaster" Inherits="System.Web.Mvc.ViewPage<ModelData>" %> 

y tengo un formulario con el formato HTML para un conjunto de casillas de verificación:

<label for="MyCheckbox">Your choice</label> 
<input type="checkbox" id="Option1" class="checkbox" name="MyCheckbox" value="Option one" /> 
<label for="Option1">Option one</label><br /> 
<input type="checkbox" id="Option2" class="checkbox" name="MyCheckbox" value="Option two" /> 
<label for="Option2">Option two</label><br /> 

y tengo un par de controladores de acción

class MyController : Controller { 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult RequestStuff(ModelData data) 
    { 
    } 
} 

y esa acción se invoca cuando se envía el formulario.

¿Cómo puedo asignar las casillas de verificación a los miembros de ModelData (y lo que los miembros Tengo que añadir a ModelData), de modo que cuando el formulario se envía la información data tiendas el cual casillas de verificación se comprueba?

Respuesta

9

Bien, este será para MVC3, pero, salvo cambios de sintaxis, también debería funcionar en MVC2. El enfoque es esencialmente el mismo.

En primer lugar, se debe preparar una (ver) modelo apropiado

public class MyViewModel 
{ 
    [DisplayName("Option 1")] 
    public bool Option1 { get; set; } 

    [DisplayName("Option 2")] 
    public bool Option2 { get; set; } 
} 

A continuación, se pasa este modelo a la vista que se está mostrando (controlador):

public ActionResult EditMyForm() 
{ 
    var viewModel = new MyViewModel() 
    return View(viewModel); 
} 

con la forma :

@model MyViewModel 
@using(Html.BeginForm()) 
{ 
    @Html.Label("Your choice") 

    @Html.LabelFor(model => model.Option1) // here the 'LabelFor' will show you the name you set with DisplayName attribute 
    @Html.CheckBoxFor(model => model.Option1) 

    @Html.LabelFor(model => model.Option2) 
    @Html.CheckBoxFor(model => model.Option2) 
    <p> 
     <input type="submit" value="Submit"/> 
    </p> 
} 

Ahora aquí los ayudantes HTML (todo el CheckBoxFor, LabelFor, EditorFor etc.) permiten vincular los datos a las propiedades del modelo.

Ahora importa, un EditorFor cuando la propiedad es del tipo bool le dará la casilla de verificación en la vista, también. :)

Y luego, cuando se envía al controlador, que se auto-enlazar los valores:

[HttpPost] 
public ActionResult EditMyForm(MyViewModel viewModel) 
{ 
    //And here the view model's items will be set to true/false, depending what you checked. 
} 
+0

Editor de mencionesPorque es un buen punto.EditorFor es útil casi siempre. Según el tipo de datos, crea entrada de texto, área de texto, casilla de verificación, etc. – ozgur

3

En primer lugar se define SelectList para las opciones. Esto será utilizado sólo para rendir casillas de verificación

public IList<SelectListItem> OptionsSelectList { get; set; } 

Than, que definen el modelo que contendrá el valor de la opción elegida sola después del post

public class ChooseOptionViewModel 
{ 
    public int OptionIdentifier { get; set; } //name or id 
    public bool HasBeenChosen { get; set; } //this is mapped to checkbox 
} 

Entonces IList de esas opciones en ModelData

public IList<ChooseOptionViewModel> Options { get; set; } 

Y, por último, la vista

@for (int i = 0; i < Model.OptionsSelectList.Count(); i++) 
    { 
     <tr> 
      <td class="hidden"> 
       @Html.Hidden("Options[" + i + "].OptionIdentifier", Model.OptionsSelectList[i].Value) 
      </td> 
      <td> 
       @Model.OptionsSelectList[i].Text 
      </td> 
      <td> 
       @Html.CheckBox("Options[" + i + "].HasBeenChosen", Model.Options != null && Model.Options.Any(x => x.OptionIdentifier.ToString().Equals(Model.OptionsSelectList[i].Value) && x.HasBeenChosen)) 
      </td> 
     </tr> 
    } 

Después de correos, que acaba de inspeccionar Options.Where(x => x.HasBeenChosen)

Esto es completamente funcional, y permitirá volver a visualizar la vista cuando se producen errores de validación, etc. Esto parece un poco complicado, pero no han llegado con cualquier mejor solución que esto.

Cuestiones relacionadas