Возврат частичного представления из контроллера с правильным идентификатором и именем во входах - PullRequest
0 голосов
/ 08 апреля 2019

Я занимаюсь разработкой веб-приложения MVC с сетевым ядром 2.2.

У меня есть следующие классы:

public class A
{
    public IList<B> Bs { get; set; }
}

public class B
{
    public string Id { get; set; }
    public string Name { get; set; }
}

Следующее представление:

@model A

@for (int i = 0; i < Model.Bs.Count; i++)
{
    <partial name="_BsPatialView" for="Bs[i]" />
}

И следующее частичное представление (_BsPatialView.cshtml):

<input type='hidden' asp-for="@Model.Id" />
<input asp-for="@Model.Name" />

До этого момента все было сгенерировано нормально.Примером созданных входных данных в частичном представлении является:

  • <input type="hidden" id="Bs_3__Id" name="Bs[3].Id" />
  • <input type="text" id="Bs_3__Name" name="Bs[3].Name" />

С именем элемента и идентификаторами моделиСвязыватель в контроллере может правильно связать все.

Проблема в том, что я пытаюсь вернуть частичное представление из контроллера.То, что я делаю, это:

public IActionResult AddBElement(A a)
{
    a.Bs.Add(new B() { Id = Guid.NewGuid() });
    return PartialView("_BsPatialView", a.Bs.Last());
}

Полученный html:

  • <input type="hidden" id="Id" name="Id" />
  • <input type="text" id="Name" name="Name" />

Итакзатем, когда я отправляю форму, в которой находятся эти входные данные, привязка модели не выполняется.

Итак, как мне вернуть частичное представление из контроллера, чтобы это исправить?Есть ли какой-либо эквивалент атрибута тега помощника тега for для использования на контроллере?

1 Ответ

0 голосов
/ 08 апреля 2019

Привязка модели использует имена полей для сопоставления их со свойствами модели.Теперь, поскольку ваше имя не содержит никакой информации о родительском классе, A, связыватель модели не знает, как их связать.

Другими словами, связыватель модели будет знать, как связать этот вход:

<input type="hidden" id="Bs_3__Id" name="A.Bs[3].Id" />

Но не этот ввод:

<input type="hidden" id="Bs_3__Id" name="Bs[3].Id" />

Одним из решений будет передача префикса A частичному представлению: См. Этот ответ

Лучшим решением было бы использовать EditorTemplate вместо частичного просмотра, который бы генерировал правильное имя для вашего поля ввода.Чтобы использовать EditorTemplate Переименуйте ваше частичное представление в B.cshtml (это должно быть имя вашего класса) и поместите его в папку /Views/Shared/EditorTemplates ... тогда вы можете использовать его следующим образом:

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

Обратитесь к этому руководству за дополнительной информацией о шаблонах редактора

Также проверьте этот вопрос, который очень похож на ваш

...