2011-03-04 24 views
5

Soy bastante nuevo en ASP.NET MVC y estoy tratando de encontrar la mejor manera de hacerlo. Probablemente sea simple, pero solo quiero hacer las cosas correctamente, así que pensé en preguntar.ASP.NET MVC - selección de lista desplegable - vistas parciales y enlace de modelo

Digamos que tengo un modelo que es la siguiente:

Tarea - Id, Descripción, AssignedStaffMember

miembro de personal - Id, Nombre, Apellido

y en mi punto de vista que desea crear una nueva tarea. Hago una vista Razor fuertemente tipada, y puedo usar EditorFor para crear cuadros de texto para la descripción, pero ¿qué pasa con AssignedStaffMember?

quiero una lista desplegable de todo el personal actual y tener la opción de seleccionar uno, entonces esto se sometió a un método de acción que es NewTask(string description, StaffMember assignedStaffMember) eso o que podría tener un int para StaffID en lugar del objeto miembro de personal y búscalo en el método de acción.

¿Cuál es la mejor manera de hacerlo? Tengo que ir a la base de datos para obtener la lista de personal, por lo que aquí es lo que pensaba:

  1. Hacer una vista parcial de la lista de caída personal de abajo, que será utilizado un par de veces y el uso @Html.Action("ListStaff", "Staff") a llámalo. El método de acción, entonces tiene

    public ActionResult ListStaff() 
    { 
        IEnumerable<StaffMember> model = _serviceLayer.GetAllStaff(); 
        return PartialView(model); 
    } 
    

    Sin embargo no estoy seguro de cómo esto va a funcionar con el enlace de modelos, mi entendimiento es que tiene que tener el nombre correcto de la forma que lo presente, que había necesidad de pasar el nombre a la vista parcial para poner el elemento, supongo?

  2. En lugar de tener que llamar a un controlador para obtener el personal, cree un modelo de vista que contenga mi tarea y una colección IEnumerable possibleStaff. posiblemente envíe esta información a una vista parcial.

  3. a Html Helper?

  4. ¿Se puede usar el Editor de alguna manera?

¿cuál (o hay más) sería el mejor? y ¿cómo podría hacer el modelo de encuadernación?

+0

+1 para el buen ejemplo Usted ha utilizado describir su problema :) Gracias a este –

Respuesta

17

Aquí hay una manera de hacerlo. Crear un TaskDetailsViewModel

public class TaskDetailsViewModel 
{ 
    public TaskDetailsViewModel() 
    { 
     this.Task = new Task(); 
     this.StaffMembers = new List<StaffMember>(); 
    } 

    public Task Task { get; set; } 
    public IEnumerable<StaffMember> StaffMembers { get; set; } 
} 

En Controlador

public ActionResult Edit(int id) 
{ 
    var task = taskRepository.GetTaskByID(id); 

    var taskDetailsViewModel = new TaskDetailsViewModel(); 

    // Populate taskDetailsViewModel from task and staff 

    return View(taskDetailsViewModel); 
} 

[HttpPost] 
public ActionResult Edit(TaskDetailsViewModel taskDetailsViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     taskRepository.Save(taskDetailsViewModel.Task); 
    } 
    else 
    { 
     // Show Error 
    } 

    return View(taskDetailsViewModel); 
} 

En Vista (ligado fuertemente a TaskDetailsViewModel)

@Html.DropDownListFor(model => model.Task.AssignedStaffMember, new SelectList(Model.StaffMembers, "ID", "FirstName", Model.Task.AssignedStaffMember)) 
@Html.ValidationMessageFor(model => model.Task.AssignedStaffMember) 
+0

, Me inclinaba a intentarlo de esta manera. Aunque estoy teniendo un problema. No parece estar vinculando la lista desplegable correctamente en el método Editar publicación: AssignedStaffMember siempre es nulo. Me puse a pensar, aún necesitaré buscar a ese miembro del personal en la base de datos una vez que lo enlace, porque incluso si funcionara, solo tendría un miembro del personal que estaba vacío, excepto su identificación ¿no? que no es demasiado útil.Entonces, ¿debería aceptar parámetros por separado para eso? – RodH257

+0

¡¡¡Gran respuesta !!!! –

Cuestiones relacionadas