Подтвердить что ты не робот

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" вручную.

4b9b3361

Ответ 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