MVC Razor Modelbinding для частичного просмотра (сообщение) - PullRequest
0 голосов
/ 01 октября 2019

Для пост-запроса привязка модели не работает, если я использую частичное представление.

Модель основного представления - MainViewModel.

public class MainViewModel
{
    ModelPart Model {get;set;}
}

public class ModelPart
{
    Public string MyVariable {get; set;}
}

Если я передаюОсновное представление моделирует частичное представление, тогда привязка успешна, и любой ввод в MyVariable находится в методе Controller Post.

MainPage

@model TEST.MainViewModel
@using (Html.BeginForm(FormMethod.Post, new { data_ajax = "false", enctype = "multipart/form-data" }))
{
    @Html.Partial("~/Areas/Views/Shared/_Input.cshtml", Model.Model)
}

Частичное

@model TEST.ModelPart

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

Это работает!

Если я передам только частичную модель ModelPart, привязка не будет успешной.

MainPage

@model TEST.MainViewModel
@using (Html.BeginForm(FormMethod.Post, new { data_ajax = "false", enctype = "multipart/form-data" }))
{
    @Html.Partial("~/Areas/Views/Shared/_Input.cshtml", Model)
}

Частичная

@model MainViewModel
@Html.EditorFor(m => m.Model.MyVariable)

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

1 Ответ

0 голосов
/ 01 октября 2019

При использовании @ Html.Partial сгенерированные имена не будут иметь префикса родителей. Таким образом, при публикации связыватель модели не сможет отобразить объект публикации.

Существует 2 обходных пути:

  • Ручная установка префикса контекста при отображении частичного представления (нехорошая идея).
  • Использовать шаблоны редактора (лучшая альтернатива).

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

Основной вид:

@model TEST.MainViewModel
@using (Html.BeginForm(FormMethod.Post, new { data_ajax = "false", enctype ="multipart/form-data" }))
{
    @Html.EditorFor(m=>m)
}

Шаблон редактора (в Views / Shared / EditorTemplates / MainViewModel.cshtml)

 @model MainViewModel
 @Html.EditorFor(m => m.Model.MyVariable)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...