asp.net mvc 3 - usar - Dos modelos en una vista en ASP MVC 3
usar dos modelos en una vista mvc asp (11)
Tengo 2 modelos:
public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }
}
public class Order
{
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
Quiero editar objetos de AMBAS clases en una sola vista, así que necesito algo como:
@model _try2models.Models.Person
@model _try2models.Models.Order
@using(Html.BeginForm())
{
@Html.EditorFor(x => x.PersonID)
@Html.EditorFor(x => x.PersonName)
@Html.EditorFor(x=>x.OrderID)
@Html.EditorFor(x => x.TotalSum)
}
Esto, por supuesto, no funciona: solo se permite una declaración ''modelo'' en un archivo .cshtml. Puede haber alguna solución?
¡Espero que te sea útil!
utilizo ViewBag para Proyecto y Modelo para la tarea, así que de esta manera estoy usando dos modelos en vista única y en el controlador definí el valor o los datos de viewbag
List<tblproject> Plist = new List<tblproject>();
Plist = ps.getmanagerproject(c, id);
ViewBag.projectList = Plist.Select(x => new SelectListItem
{
Value = x.ProjectId.ToString(),
Text = x.Title
});
y en vista tbltask y projectlist son mis dos modelos diff
@ {
IEnumerable<SelectListItem> plist = ViewBag.projectList;
} @model List
Cree un modelo de vista principal que contenga ambos modelos.
public class MainPageModel{
public Model1 Model1{get; set;}
public Model2 Model2{get; set;}
}
De esta forma, puede agregar modelos adicionales en una fecha posterior con un mínimo esfuerzo.
De hecho, hay una manera de usar dos o más modelos en una vista sin envolverlos en una clase que contenga ambos.
Usando Employee como modelo de ejemplo:
@model Employee
En realidad se trata como.
@{ var Model = ViewBag.model as Employee; }
Entonces el método Vista (empleado) está configurando su modelo en ViewBag y luego ViewEngine lo está lanzando.
Esto significa que,
ViewBag.departments = GetListOfDepartments();
return View(employee);
Se puede usar como,
@model Employee
@{
var DepartmentModel = ViewBag.departments as List<Department>;
}
Esencialmente, puede usar lo que está en su ViewBag como un "Modelo" porque así es como funciona de todos modos. No digo que esto sea arquitectónicamente ideal, pero es posible.
Otra forma de la que nunca se habla es Crear una vista en MSSQL con todos los datos que desea presentar. Luego use LINQ to SQL o lo que sea para mapearlo. En su controlador, regréselo a la vista. Hecho.
Otra opción que no necesita crear un Modelo personalizado es usar un Tuple<> .
@model Tuple<Person,Order>
No es tan limpio como crear una nueva clase que contenga ambos, según la respuesta de Andi, pero es viable.
Para usar la tupla, debe hacer lo siguiente, en la vista, cambie el modelo a:
@model Tuple<Person,Order>
para utilizar los métodos @html, debe hacer lo siguiente, es decir:
@Html.DisplayNameFor(tuple => tuple.Item1.PersonId)
o
@Html.ActionLink("Edit", "Edit", new { id=Model.Item1.Id }) |
Item1 indica el primer parámetro pasado al método Tupel y puede usar Item2 para acceder al segundo modelo y así sucesivamente.
en su controlador necesita crear una variable de tipo Tuple y luego pasarla a la vista:
public ActionResult Details(int id = 0)
{
Person person = db.Persons.Find(id);
if (person == null)
{
return HttpNotFound();
}
var tuple = new Tuple<Person, Order>(person,new Order());
return View(tuple);
}
Otro ejemplo: varios modelos en una vista
Puede usar el patrón de presentación http://martinfowler.com/eaaDev/PresentationModel.html
Este modelo de "Vista" de presentación puede contener tanto Persona como Orden, esta nueva
clase puede ser el modelo al que su vista hace referencia.
Si eres fan de tener modelos muy planos, solo para apoyar la vista, deberías crear un modelo específico para esta vista en particular ...
public class EditViewModel
public int PersonID { get; set; }
public string PersonName { get; set; }
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
Muchas personas usan AutoMapper para mapear desde sus objetos de dominio a sus vistas planas.
La idea del modelo de vista es que solo admite la vista, nada más. Usted tiene uno por vista para asegurarse de que solo contenga lo que se requiere para esa vista, no un montón de propiedades que desea para otras vistas.
Simplemente cree un modelo de vista única con toda la información necesaria, normalmente lo que hago es crear un modelo para cada vista, así puedo ser específico en cada vista, ya sea eso o hacer un modelo padre y heredarlo. O haga un modelo que incluya ambas vistas.
Personalmente, simplemente los agregaría en un modelo, pero así es como lo hago:
public class xViewModel
{
public int PersonID { get; set; }
public string PersonName { get; set; }
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
@model project.Models.Home.xViewModel
@using(Html.BeginForm())
{
@Html.EditorFor(x => x.PersonID)
@Html.EditorFor(x => x.PersonName)
@Html.EditorFor(x => x.OrderID)
@Html.EditorFor(x => x.TotalSum)
}
no puede declarar dos modelos en una vista, intente utilizar Html.Action("Person", "[YourController]")
y Html.Action("Order", "[YourController]")
.
Buena suerte.
ok, todos tienen sentido y tomé todas las piezas y las puse aquí para ayudar a novatos como yo que necesitan una explicación de principio a fin.
Haces tu gran clase que tiene 2 clases, según la respuesta de @ Andrew.
public class teamBoards{
public Boards Boards{get; set;}
public Team Team{get; set;}
}
Luego en tu controlador llenas los 2 modelos. A veces solo necesitas completar uno. Luego, en la devolución, usted hace referencia al modelo grande y llevará los 2 interiores a la Vista.
TeamBoards teamBoards = new TeamBoards();
teamBoards.Boards = (from b in db.Boards
where b.TeamId == id
select b).ToList();
teamBoards.Team = (from t in db.Teams
where t.TeamId == id
select t).FirstOrDefault();
return View(teamBoards);
En la parte superior de la vista
@model yourNamespace.Models.teamBoards
Luego cargue sus entradas o pantallas haciendo referencia al gran contenido de Modelos:
@Html.EditorFor(m => Model.Board.yourField)
@Html.ValidationMessageFor(m => Model.Board.yourField, "", new { @class = "text-danger-yellow" })
@Html.EditorFor(m => Model.Team.yourField)
@Html.ValidationMessageFor(m => Model.Team.yourField, "", new { @class = "text-danger-yellow" })
Y. . . .back en el rancho, cuando entra el Post, haga referencia a la Big Class:
public ActionResult ContactNewspaper(teamBoards teamboards)
y hacer uso de lo que devolvió el modelo (s):
string yourVariable = teamboards.Team.yourField;
Probablemente tenga algunas cosas de validación de la anotación de datos en la clase y probablemente ponga if (ModelState.IsValid) en la parte superior del bloque de guardar / editar. . .