2009-06-03 24 views
31

Estoy tratando de generar tales HTMLASP.NET MVC - Ver con múltiples modelos

<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 procesada por la presente Acción:

public ActionResult Process(Foo foo, Bar bar) 
    { 
     ... 
    } 

Teniendo en cuenta el código de Acción

public ActionResult Edit() 
    { 
     ViewData["foo"] = new Foo { A = "aaa" }; 
     ViewData["bar"] = new Bar { B = "bbb" }; 

     return View(); 
    } 

¿qué debo escribir en la vista Edit.aspx? No quiero escribir los nombres 'foo.a' y 'bar.b' manualmente.

Respuesta

39

cadena indexados 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. IE:

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 es inflexible a FooBarViewData y se puede llamar a los miembros de ese objeto mediante la propiedad Model.

8

Tienes 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 se le haga ningún valores iniciales.

<form action="/some/process" method="post"> 
    <%= Html.Hidden("foo.A") %> 
    <%= Html.Hidden("bar.B") %> 
</form> 
0

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

usted va a tener que unir varios modelos en una ViewModel y agarrar todas las propiedades de cada modelo que desea utilizar en el ViewModel.

PERO, es ALTAMENTE aconseja que se crea un nuevo controlador y un nuevo Ver 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, usted debería ser capaz de pasar el ViewModel en un punto de vista diferente. Solo asegúrese de declarar esta directiva similar correctamente en la página foobar.cshtml.

@model FooBar.Models.FooBarViewModel 
Cuestiones relacionadas