2009-06-03 2 views
31

Я пытаюсь создать такой HTMLASP.NET MVC - Просмотр с несколькими моделями

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

поэтому он может быть обработан этим действий:

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

Учитывая код действия

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

     return View(); 
    } 

Что я должен писать в виде Edit.aspx? Я не хочу писать имена «foo.a» и «bar.b» вручную.

ответ

39

С индексом строки ViewData - это плохо. То, что вы, вероятно, хотите сделать, это сделать небольшой класс-оболочку для ваших данных с несколькими переменными и передать их строго типизированному представлению. 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); 
} 

Тогда ваш взгляд просто сильно типизированный к FooBarViewData, и вы можете назвать член этого объекта с помощью Model свойства.

8

У вас есть несколько вариантов. Во-первых, вы можете ссылаться на них из ViewData и использовать расширение HtmlHelper. Или вы можете создать определенную для представления модель и использовать сильно типизированную страницу просмотра для 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 имеет тип ViewPage<EditModel>)

В любом случае, расширение HtmlHelper подберут любые начальные значения.

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

Решение, указанное выше, может быть устаревшим. Это решение, похоже, работает для ASP.Net MVC5 +.

Вам понадобится использовать метод ViewModel. Это отличный учебник, который вы можете проверить.

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

Вы будете иметь, чтобы объединить несколько моделей в один ViewModel и захватить все свойства от каждой из моделей, которые вы хотите использовать в ViewModel.

НО, это ДАЛЕКО Рекомендуется создать новый контроллер и новый View для размещения вновь созданного ViewModel. Прочтите учебник.

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

Но в этом случае, вы должны быть в состоянии передать ViewModel в другую точку зрения. Просто убедитесь, что вы правильно указали эту аналогичную директиву на странице foobar.cshtml.

@model FooBar.Models.FooBarViewModel 
Смежные вопросы