asp.net-mvc - una - tuple mvc
ASP.NET MVC-Vista con mĂșltiples modelos (3)
La solución anterior puede estar desactualizada. Esta solución parece funcionar para ASP.Net MVC5 +.
Vas a tener que usar el método ViewModel
. Este es un excelente tutorial que puedes consultar.
http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example
ViewModel
que unir varios modelos en un ViewModel
y tomar todas las propiedades de cada modelo que desee usar en ViewModel
.
PERO , se ViewModel
que cree un nuevo Controlador y una nueva Vista para acomodar el ViewModel
recién creado. Lee el tutorial
public class FooBarViewModel
{
public string A {get; set;} //Property for Foo
public string B {get; set;} //Property for Bar
}
public ActionResult Edit()
{
FooBarViewModel fooBarVM = new FooBarViewModel();
fooBarVM.A = "aaa";
fooBarVM.B = "bbb";
return View(fooBarVM);
}
Pero en este caso, debería poder pasar ViewModel
a una vista diferente. Solo asegúrese de declarar esta directiva similar correctamente en la página foobar.cshtml
.
@model FooBar.Models.FooBarViewModel
Estoy tratando de generar ese HTML
<form action="/some/process" method="post">
<input type="hidden" name="foo.a" value="aaa"/>
<input type="hidden" name="bar.b" value="bbb"/>
<input type="submit" />
</form>
para que pueda ser procesado por esta Acción:
public ActionResult Process(Foo foo, Bar bar)
{
...
}
Dado el código de Acción
public ActionResult Edit()
{
ViewData["foo"] = new Foo { A = "aaa" };
ViewData["bar"] = new Bar { B = "bbb" };
return View();
}
¿Qué debería escribir en la vista Edit.aspx? No quiero escribir los nombres ''foo.a'' y ''bar.b'' manualmente.
String-indexed ViewData
es malo. Lo que probablemente quiera hacer es crear una pequeña clase de contenedor para sus datos de vista multivariable y pasarla a una vista fuertemente tipada. ES DECIR:
public class FooBarViewData
{
public Foo Foo {get; set;}
public Bar Bar {get; set;}
}
public ActionResult Edit()
{
FooBarViewData fbvd = new FooBarViewData();
fbvd.Foo = new Foo(){ A = "aaa"};
fbvd.Bar = new Bar(){ B = "bbb"};
return View(fbvd);
}
Luego, su vista se escribe fuertemente en FooBarViewData
y puede llamar a los miembros de ese objeto utilizando la propiedad Model
.
Usted tiene un par de opciones. En primer lugar, puede hacer referencia a ellos desde ViewData y usar una extensión HtmlHelper. O bien, podría crear un modelo específico de vista y usar una página de vista fuertemente tipada para Edit.aspx.
public class EditModel
{
public Foo foo { get; set; }
public Bar bar { get; set; }
}
public ActionResult Edit()
{
var model = new EditModel();
model.foo = new Foo { A = "aaa" };
model.bar = new Bar { B = "bbb" };
return View( model );
}
(Edit.aspx es de tipo ViewPage<EditModel>
)
De cualquier manera, la extensión HtmlHelper recogerá cualquier valor inicial.
<form action="/some/process" method="post">
<%= Html.Hidden( "foo.A" ) %>
<%= Html.Hidden( "bar.B" ) %>
</form>