2009-06-03 15 views
31

Próbuję wygenerować takich HTMLASP.NET MVC - widok z wielu modeli

<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> 

więc może być przetwarzany przez to działanie:

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

Ze względu na kod akcji

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

     return View(); 
    } 

co powinienem napisać w widoku Edit.aspx? Nie chcę ręcznie pisać nazw "foo.a" i "bar.b".

Odpowiedz

39

Indeksowane na taśmie ViewData jest złe. Prawdopodobnie chcesz zrobić małą klasę otwieracza dla danych zmiennych o wielu zmiennych i przekazać ją do mocno wpisanego widoku. 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); 
} 

Wtedy twój widok jest po prostu mocno wpisane do FooBarViewData i można nazwać członków tego obiektu za pomocą właściwości Model.

8

Masz kilka możliwości. Po pierwsze, możesz odwoływać się do nich z ViewData i używać rozszerzenia HtmlHelper. Można też utworzyć model specyficzny dla widoku i użyć silnie napisanej strony widoku dla 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 jest typu ViewPage<EditModel>)

czy inaczej, rozszerzenie HtmlHelper odbierze żadnych wartości początkowych.

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

Powyższe rozwiązanie może być nieaktualne. To rozwiązanie wydaje się działać dla ASP.Net MVC5 +.

Będziesz musiał użyć metody ViewModel. To doskonały samouczek, który możesz sprawdzić.

http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example

Będziesz musiał dołączyć do wielu modeli w jeden ViewModel i złapać wszystkie właściwości od siebie modeli, które chcesz użyć do ViewModel.

ALE, to BARDZO zaleca się utworzenie nowego Controller i nowy View aby dostosować się do nowo utworzonego ViewModel. Przeczytaj samouczek.

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); 
} 

Ale w tym przypadku, powinieneś być w stanie przekazać ViewModel do innego widoku. Tylko upewnij się, że deklarujesz tę podobną dyrektywę poprawnie na stronie foobar.cshtml.

@model FooBar.Models.FooBarViewModel 
Powiązane problemy