В ASP.NET MVC3 как визуализировать несколько PartialViews, поддерживаемых несколькими моделями? - PullRequest
3 голосов
/ 26 апреля 2011

Как в MVC3 Razor создать страницу с несколькими формами, чтобы каждая форма представляла собой частичное представление, отображаемое с помощью собственной модели?

Мы пробовали различные формы вызова Html.RenderPartial (), передавая имя частичного вида, а также экземпляр наших моделей, к которым мы обращаемся через ViewBag, но каждый из опробованных нами методов, кажется, имеет серьезный проблем, и поэтому у нас должно быть фундаментальное недопонимание того, как это должно работать в идеальном мире.

Мы нашли несколько SO-ответов по схожим темам (, как эта ), рекомендующих «супермодель», которая содержит ссылки на каждую из подмоделей, которые могут понадобиться нашим частичным представлениям, но мы не можем найти пример того, как вы на самом деле будете использовать данные этих подмоделей, например при попытке написать EditorTemplates.

Редактировать: Позвольте мне немного уточнить мой вопрос. Мы можем сделать частичное представление или даже действие (используя RenderAction, как рекомендовано Mark S.). Однако наша основная проблема заключается в том, что когда эти формы отправляются обратно, например, сохраняя состояние модели в этой области частичного просмотра, контроллер, похоже, не знает, на какую модель мы ссылаемся. Как мы должны звонить в контроллер?

Мы пробовали несколько разных способов рендеринга этих частичных представлений. Наша первая попытка была такой:

@using (Html.BeginForm("SaveAccountInfo", null, FormMethod.Post, new { id = "section1-form" }))
{
    @Html.EditorForModel("AccountInfo", (OurModels.AccountInfo) ViewBag.account_info)
}

ViewBag.account_info содержит данные модели для этого одного частичного представления.

Мы также попробовали:

@{Html.RenderPartial("FormAccountInfo", (OurModels.AccountInfo) ViewBag.account_info);}

А сейчас:

@{Html.RenderAction("FormAccountInfo", "Main", new { account_info = (OurModels.AccountInfo) ViewBag.account_info }); }

Но независимо от того, какой метод мы используем для визуализации этой единственной формы на странице, когда эта форма передается для обработки, мы не можем получить доступ к каким-либо из представленных данных через модель? Я чувствую, что мы делаем что-то действительно глупое, но мы новичок в MVC.

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Не зацикливайтесь на абстракциях, с момента рендеринга страницы до момента вызова метода контроллера вы работаете только в HTML и HTTP.

Если вы хотите отправить сообщение обратнодругой метод, есть множество способов сделать это.У вас может быть несколько HTML-форм на вашей странице, или вы можете использовать что-то вроде jQuery для выполнения публикации.То, какое действие контроллера забирает ваше сообщение и какие данные отправляются обратно, определяется формой на странице HTML и ее содержимым.Обработчики MVC заберут запрос и попытаются привязать URL-адрес запроса и его содержимое к одному из доступных действий, которые ему соответствуют.

Чтобы «опубликовать модель», необходимо отправить данные обратно вподходящее действие таким образом, чтобы модель-связыватель могла его прочитать.Это могут быть данные JSON (если вы используете MVC 3) или форма с парами имя-значение.Однако контроллер ничего не знает о странице, которая запрашивает данные, или о том, как они были созданы.Он даже не знает, выполняется ли запрос страницей.

Вы можете попробовать это сами, создав обычную HTML-страницу с формой, настроенной для публикации по URL-адресу одного из ваших контроллеров MVC.Пока имена полей формы совпадают с именами свойств в аргументе действия вашего контроллера, MVC будет связывать его и вызывать действие.

Если у вас сложные представления, вы можете обнаружить, что jQuerypost - это путь, с некоторыми клиентскими методами, которые собирают данные со страницы и создают объекты JSON для отправки обратно.Использование этого метода дает вам очень точный контроль над тем, какие данные отправляются обратно, тогда как с формами у вас есть ограничения (например, перекрывающиеся данные и т. Д.).

Edit - ответ на комментарий

Вот пример, которыйиспользует только необработанный HTML, чтобы показать очень простой случай:

Public Class HomeController

    'Other action methods...

    <HttpPost()>
    Function SayHello(myName As String) As ActionResult
        Return Content("Hello " & myName)
    End Function

End Class

и HTML-форму (я добавил это в представление индекса, но оно может пойти куда угодно)

<form action="/Home/SayHello" method="post">
    <input type="text" name="myName" />
    <input type="submit" />
</form>

I 'Мы установили имя на <input> в соответствии с именем параметра, что дает MVC руку помощи.Хотя есть только 1 значение, отправленное обратно, я мог бы назвать это как-то еще.Однако, если бы я сделал это:

<form action="/Home/SayHello" method="post">
    <input type="text" name="aName" />
    <input type="text" name="anotherName" />
    <input type="submit" />
</form>

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

Изменитьоднако для этого:

<form action="/Home/SayHello" method="post">
    <input type="text" name="myName" />
    <input type="text" name="anotherName" />
    <input type="submit" />
</form>

... и связыватель модели теперь может использовать имя, чтобы правильно определить, какое значение использовать, а какое игнорировать.

В случае сильногоТипизированные действия:

Public Class HomeController

    <HttpPost()>
    Function SayHello(person As SimplePerson) As ActionResult
        Return Content("Hello " & person.FirstName)
    End Function

End Class

Public Class SimplePerson
    Public Property FirstName As String
    Public Property Surname As String
End Class

Вам необходимо иметь имена форм, соответствующие именам свойств.Моя форма aName / anotherName вернула бы правильную форму, но связыватель модели не установил бы никаких свойств, потому что он не знает, что к чему.Это, однако, будет работать:

<form action="/Home/SayHello" method="post">
    <input type="text" name="FirstName" />
    <input type="text" name="Surname" />
    <input type="submit" />
</form>
0 голосов
/ 26 апреля 2011

Вы можете использовать метод Html.RenderAction().Он предоставляет набор функций, которые позволяют вам выполнять рендеринг и действия, а также вызывать его для получения собственной информации из вашего хранилища данных.Вот ссылка на документацию: http://msdn.microsoft.com/en-us/library/system.web.mvc.html.childactionextensions.renderaction.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...