Привязка модели списка частичного просмотра ASP.NET Core 2 - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть модель, у которой есть список моделей public List<BaseModuleModel> modules { get; set; }

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

@foreach (BaseModuleModel module in Model.modules)
        {
            <div class="section row col-lg-8">
                <div class="section-header">
                    <p class="header-text">@module.PartialName</p>
                </div>
                <div class="row col-lg-12 section-content">
                    @await Html.PartialAsync("~/Views/Partials/" + module.PartialName + "Partial.cshtml", module)
                </div>
            </div>
        }

Это все работает как задумано.Но когда я отправляю свою форму, частичное представление не изменяет никакие переменные BaseModuleModels в списке, и у всех них все переменные равны нулю.

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

Частичное представление:

@model Lidmaatschap.Models.modules.VoorwaardenModule

<div class="row col-lg-12 section-content">
    <div class="col-lg-6">
        <label asp-for="PrivacyStatement" class="control-label"></label><br />
        <input asp-for="PrivacyStatement" type="checkbox" value="false" /> Ik ga akkoord met de privacy voorwaarden.
        <span asp-validation-for="PrivacyStatement" class="text-danger"></span>
    </div>
    <div class="col-lg-6">
        <label asp-for="FirstName" class="control-label"></label>
        <input asp-for="FirstName" class="form-control wide-full" />
        <span asp-validation-for="FirstName" class="text-danger"></span>
    </div>
</div>

Класс модели:

public class VoorwaardenModule : BaseModuleModel
    {
        public VoorwaardenModule() : base("Voorwaarden")
        {

        }

        [Display(Name = "Privacy Verklaring")]
        //[Range(typeof(bool), "true", "true", ErrorMessage = "Je moet akkoord gaan met het privacy beleid om door te gaan.")]
        public bool PrivacyStatement { get; set; }

        [Display(Name = "Voornaam")]
        [Required]
        public string FirstName { get; set; }
    }

Мой Index.cshtml: https://pastebin.com/ErXcJz0a

MemberModel.cs: https://pastebin.com/KaSVUV6Q

HomeController.cs: https://pastebin.com/YNxJPvmX

1 Ответ

0 голосов
/ 25 февраля 2019

Частичное представление требует родительского контекста для правильного именования полей формы.По умолчанию он просто будет использовать имя свойства модели, в которую он передан, поэтому ваш PrivacyStatement связанный ввод будет иметь name="PrivacyStatement", тогда как то, что вам нужно на самом деле , равно name="modules[N].PrivacyStatement", в порядкеправильно связать его обратно на пост.Таким образом, у вас есть две проблемы.

Во-первых, вы не можете использовать foreach.Частичное представление будет нуждаться в индексе элемента в списке, что означает, что вам нужно фактически передать ему индексированный элемент, то есть modules[N].Во-вторых, вам нужно предоставить HtmlFieldPrefix из родительского представления, хотя это возможно сделать с Html.PartialAsync, используя параметр viewData, это довольно трудоемкий и уродливый код.Намного лучше использовать помощник по тегам <partial> (который в любом случае рекомендуют документы) и его атрибут for.

Длинный и короткий, измените свой код на:

@for (var i = 0; i < Model.modules.Count; i++)
{
    <div class="section row col-lg-8">
        <div class="section-header">
            <p class="header-text">@Model.modules[i].PartialName</p>
        </div>
        <div class="row col-lg-12 section-content">
            <partial name="~/Views/Partials/@(Model.modules[i].PartialName)Partial.cshtml" for="modules[i]" />
        </div>
    </div>
}
...