2009-06-03 15 views
31

ich eine solche HTMLASP.NET MVC - Ansicht mit mehreren Modellen

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

so kann es durch diese Aktion verarbeitet werden, um zu erzeugen versuche:

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

den Aktionscode

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

     return View(); 
    } 

Was soll ich in Edit.aspx Ansicht schreiben? Ich möchte die Namen 'foo.a' und 'bar.b' nicht manuell schreiben.

Antwort

39

String indiziert ViewData ist schlecht. Wahrscheinlich möchten Sie eine kleine Wrapper-Klasse für Ihre Daten mit mehreren Variablen erstellen und diese an eine stark typisierte Ansicht übergeben. 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); 
} 

Dann wird Ihrer Ansicht nach nur stark zu FooBarViewData eingegeben und Sie können Elemente dieses Objekts mit der Model Eigenschaft nennen.

8

Sie haben ein paar Möglichkeiten. Zunächst können Sie von ViewData aus auf sie verweisen und eine HtmlHelper-Erweiterung verwenden. Oder Sie könnten ein Ansichtsspezifisches Modell erstellen und eine stark typisierte Ansichtsseite für Edit.aspx verwenden.

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 ist vom Typ ViewPage<EditModel>)

In beiden Fällen wird die Htmlhelper Verlängerung alle Anfangswerte abholen.

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

Die obige Lösung ist möglicherweise veraltet. Diese Lösung scheint für ASP.Net MVC5 + zu funktionieren.

Sie müssen die ViewModel Methode verwenden. Dies ist ein hervorragendes Tutorial, das Sie auschecken können.

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

Sie werden mehrere Modelle in einer ViewModel und greifen alle Eigenschaften von jedem Modelle, die Sie in die ViewModel verwenden möchten müssen mitmachen.

ABER ist es HOCH ratsam, dass Sie einen neuen -Controller und eine neue Ansicht erstellen die neu ViewModel erstellt zu empfangen. Lesen Sie das 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); 
} 

Aber in diesem Fall sollten Sie in der Lage sein, die ViewModel in eine andere Ansicht zu übergeben. Stellen Sie sicher, dass Sie diese ähnliche Anweisung auf der Seite foobar.cshtml korrekt deklarieren.

@model FooBar.Models.FooBarViewModel 
Verwandte Themen