2011-07-10 17 views
5

Tengo la aplicación web MVC3 donde necesitamos completar la lista de botones de radio con validación. Mi modelo es algo como esto:objeto complejo de unión de MVC Radiobutton

public class EmployeesViewModel 
{ 
    public List<Employee> listEmployee { get; set; } //To persist during post 
    public IEnumerable<SelectListItem> selectListEmployee { get; set; } 

    [Required] 
    public Employee selectedEmployee { get; set; } 
} 

public class Employee 
{ 
    public int ID {get; set;} 
    public string Name {get; set} 
    public string Department {get; set} 
} 

que necesito para llenar la lista botón de radio algo así como a continuación:

  • Employee1ID - Employee1Name - Employee1Department // ID - nombre - departamento
  • Employee2ID - Employee2Name - Employee2Department
  • Employee3ID - Employee3Name - Employee3Department

El empleado seleccionado debe almacenarse en el campo "selectedEmployee". ¿Cuál es la mejor manera o la manera más limpia de llenar estas listas de botones de radio en MVC3?

Nota: Principalmente buscando a dos tareas: 1. almacenamiento objeto "personal" de cada etiqueta botón de opción "Entrada", de manera que se guardará empleado seleccionado al campo "selectedEmployee" 2. Mejor manera de marcar "Empleado "Objeto como campo obligatorio

¡Mucho aprecio su ayuda!

Gracias,

Respuesta

11

Esto es lo que yo recomendaría. Comience con un limpio modelo de vista, uno que realmente expresa lo que la vista contiene como información:

public class EmployeesViewModel 
{ 
    public List<EmployeeViewModel> ListEmployee { get; set; } 

    [Required] 
    public int? SelectedEmployeeId { get; set; } 
} 

public class EmployeeViewModel 
{ 
    public int ID { get; set; } 
    public string Label { get; set; } 
} 

luego de un controlador:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new EmployeesViewModel 
     { 
      ListEmployee = GetEmployees() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(EmployeesViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // the model is invalid, the user didn't select an employee 
      // => refetch the employee list from the repository and 
      // redisplay the view so that he can fix the errors 
      model.ListEmployee = GetEmployees(); 
      return View(model); 
     } 

     // validation passed at this stage 
     // TODO: model.SelectedEmployeeId will contain the id 
     // of the selected employee => use your repository to fetch the 
     // actual employee object and do something with it 
     // (like grant him the employee of the month prize :-)) 

     return Content("thanks for submitting", "text/plain"); 
    } 

    // TODO: This doesn't belong here obviously 
    // it's only for demonstration purposes. In the real 
    // application you have a repository, use DI, ... 
    private List<EmployeeViewModel> GetEmployees() 
    { 
     return new[] 
     { 
      new EmployeeViewModel { ID = 1, Label = "John (HR)" }, 
      new EmployeeViewModel { ID = 2, Label = "Peter (IT)" }, 
      new EmployeeViewModel { ID = 3, Label = "Nathalie (Sales)" }, 
     }.ToList(); 
    } 
} 

y, finalmente, una vista:

@model EmployeesViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationMessageFor(x => x.SelectedEmployeeId) 
    @foreach (var employee in Model.ListEmployee) 
    { 
     <div> 
      @Html.RadioButtonFor(x => x.SelectedEmployeeId, employee.ID, new { id = "emp" + employee.ID }) 
      @Html.Label("emp" + employee.ID, employee.Label) 
     </div> 
    } 
    <input type="submit" value="OK" /> 
} 
+0

Gracias Darin! ese modelo de vista realmente sirve para el propósito! – matmat

+0

Buscando una idea más de ti. Digamos en mi caso, ¿qué sucede si tengo una clave compuesta en mi tabla "Empleado"? (como "ID" y "Departamento" juntos forman una clave compuesta) En este caso necesito pasar ID y Departamento para obtener el objeto real que quiero. ¿Cuál es la mejor manera de hacer eso? – matmat

+1

@matmat, un botón de opción envía solo un valor, por lo que tener claves compuestas en este caso no tendría sentido. Puede usar una clave primaria única de su base de datos. Como alternativa, podría tener la propiedad de ID como una cadena del formulario 'ID_DEPT' que podría dividir en su controlador cuando se reenvía el formulario y obtener los dos valores, pero eso parece un hackish. Una clave primaria única es un enfoque mucho mejor. –

Cuestiones relacionadas