ASP.NET MVC - просмотр с несколькими моделями - PullRequest
33 голосов
/ 03 июня 2009

Я пытаюсь сгенерировать такой 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' вручную.

Ответы [ 4 ]

40 голосов
/ 03 июня 2009

String-indexed 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.

10 голосов
/ 03 июня 2009

У вас есть несколько вариантов. Во-первых, вы можете ссылаться на них из 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 голосов
/ 12 февраля 2019

Я некоторое время пытался заставить работать две модели, и большинство ответов, с которыми я столкнулся, предназначались для более ранних версий MVC.

Мне показалось, что следующий урок лучше всего подходит для MVC 5, как предложено David Lee :

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

Я создал объединение и выбрал только те столбцы, которые мне были нужны в обеих моделях.

У меня это работало с частичным представлением

В view.cshtml

 @model IEnumerable<Test.Models.TestViewModel>
    ...
      @foreach (var item in Model)
                    {
                        <tr>
                            <td style="text-align:center;vertical-align:middle">
                                @Html.DisplayFor(modelItem => item.TestName)
...
0 голосов
/ 22 сентября 2017

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

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

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

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

НО , ВЫСОКО * рекомендует создать новый контроллер и новый вид для разместить только что созданный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...