ASP.NET MVC - просмотр с несколькими моделями
Я пытаюсь создать такой 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>
поэтому он может быть обработан этим действием:
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" вручную.
Ответы
Ответ 1
Строковый индекс 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
.
Ответ 2
У вас есть несколько вариантов. Во-первых, вы можете ссылаться на них из 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>
Ответ 3
Решение выше может быть устаревшим. Это решение, похоже, работает для 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