Определить тип модели в Ajax Post - PullRequest
0 голосов
/ 05 июля 2018

У меня есть ASP.NET MVC View. В моем представлении я хочу сделать запрос AJAX Post для обновления PartialView внутри представления.

Это моя модель:

public class HomeListViewModel
{
    public MainQueryViewModel MainQuery { get; set; }

    // other properties
}

А это мой вид (у которого есть PartialView):

@model MyNameSpace.HomeListViewModel

@using (Ajax.BeginForm("List", new AjaxOptions { UpdateTargetId = "browsePartialView", HttpMethod = "Post" }))
{
    @Html.AntiForgeryToken()
    <div id="browsePartialView">
        @Html.Partial("_MainQuery", Model.MainQuery)
    </div>
}

Теперь это моя проблема: я хочу, чтобы AJAX POST отправлял объект типа: HomeListViewModel в контроллер, но AJAX отправляет объект типа MainQuery.

Это мое действие контроллера:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult List(HomeListViewModel HomeListViewModel)
{
    var myModel = HomeListViewModel;    // <-- an empty model is passed in

    // some action
}

Если я изменю тип параметра на: MainQuery, тогда он будет работать нормально:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult List(MainQuery MainQuery)
{
    var myModel = MainQuery;    // <-- all ok

    // some action
}

Есть ли способ сообщить AJAX, какую модель он должен публиковать на контроллере?

1 Ответ

0 голосов
/ 05 июля 2018

При использовании Html.Partial() создается элемент управления формы с name атрибутами, которые относятся к MainQueryViewModel, а не HomeListViewModel.

Предпочтительный метод - использовать EditorTemplate, который будет префиксировать атрибуты name, чтобы вы получили name="MainQuery.someProperty" вместо name="someProperty", который вы получаете в настоящее время.

Измените имя вашего партиала на MainQueryViewModel.cshtml (в соответствии с именем класса) и переместите его в папку /Views/Shared/EditorTemplates (или /Views/yourControllerName/EditorTemplates), а для генерации html используйте

@Html.EditorFor(m => m.MainQuery)

Другой вариант добавления префикса - передать префикс с помощью additionalViewData

@Html.Partial("_MainQuery", Model.MainQuery, 
new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "MainQuery" }})

А для метода расширения HtmlHelper, который упрощает его до @Html.PartialFor(m => m.MainQuery, "_MainQuery"), см. получение значений из вложенного сложного объекта, который передается в частичное представление .

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