6

Soy nuevo en MVC, así que tal vez esta es una pregunta estúpida: estoy tratando de entender las opiniones fuertemente tipadas en asp. mvc neto Estoy trabajando en la versión 3. Si tengo un proyecto con 2 modelos, diga Person and Department. Una persona debe pertenecer a un departamento. Así que tengo mi modelo Departamento (y he generado mi controlador y la interfaz CRUD):ASP.NET MVC3, ¿por qué la lista desplegable se basa en viewbag incluso en una vista fuertemente tipada?

public class Department 
{ 
    public int Id { get; set;} 
    public string DeparmentName { get; set;} 
} 

entonces tengo un modelo de persona que hace referencia Departamento:

public class Person 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public int Department_Id { get; set; } 
    [ForeignKey("Department_Id") 
    public virtual Department Department { get; set;} 
} 

Ahora genero mi controlador y Vistas . Ahora, cuando miro en el PersonController, he lo siguiente para la Creación:

public ActionResult Create() 
{ 
    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName"); 
    return View(); 
} 

y en persona \ Create.cshtml, el código para crear el Departamento desplegable es

@Html.DropDownList("Department_Id", String.Empty) 

Mientras Entiéndelo, DropDownList Html helper está usando ViewBag para crear mi lista desplegable. Sin embargo, FirstName y LastName parecen tener sus campos de entrada creados sin depender de ViewBag, por lo que en mi vista, puedo tener tiempo de compilación en mis campos FirstName y LastName porque mi vista está fuertemente tipada, pero no en mi DropDownList.

¿Hay algún motivo por el que DropDownList para el departamento no tenga un tipeo fuerte o estoy haciendo algo mal y hay una manera de hacerlo fuertemente tipado?

Gracias :)

Respuesta

5

La razón por la que necesita un viewbag es porque su instancia Person, a la que se une su vista, no tiene los datos para todos los departamentos posibles, solo el departamento al que pertenece. Lo que sucede en esta línea:

ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName"); 

¿Es que todos los departamentos de la base de datos se añaden a la lista de selección (para su desplegables para unirse a) con el identificador como la clave asn DepartmentName como valor. Después de que su vista esté vinculada a la Persona, el menú desplegable mostrará el Departamento correspondiente.

+0

Hola Edwin, gracias, eso tiene sentido, una sola persona tiene un Department_ID, pero pensé que la vista era vinculante para mi modelo Person, que define la relación con los departamentos a través del propiedad "virtual"? Tal vez estoy buscando demasiado "magia" en el marco de MVC. – Rick

+0

@Rick: supongo que sí. La vista solo se une al único Departamento definido por su Persona.Utiliza la viewbag para transferir la lista completa de departamentos. Por cierto, ViewBag es simplemente un envoltorio alrededor de ViewData (de la otra respuesta) que le permite crear propiedades dinámicas. –

2

Si está utilizando puntos de vista inflexible de tipos, se debe tener un modelo inflexible de tipos que se pasa a la vista:

public class ViewData { 
    public IList<Departments> Departments {get; set;} 
} 

Luego, en que su controlador tiene:

public ActionResult Create() 
{ 
    ViewData model = new ViewData(); 
    model.Departments = db.Deparments; 
    return View(model); 
} 

el último paso es crear la lista de selección y caer sobre la vista:

@model ViewData 
@SelectList list = new SelectList(Model.Deparments, "Id", "DepartmentName"); 
@Html.DropDownList("Department_Id", list); 

Espero que esto tenga sentido.

+0

Hola Steve - gracias - ¿la clase ViewData ha creado un "ViewModel"? – Rick

+0

Sí, generalmente pongo todos los modelos de vista en la carpeta de modelos en la solución. Generalmente los llamo {viewName} ViewData.cs – Steve

Cuestiones relacionadas