Привязка модели не работает внутри частичного представления

#asp.net-mvc #model-binding #partial

#asp.net-mvc #привязка модели #частичное

Вопрос:

Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что в моем частичном представлении флажки неправильно привязаны платформой MVC. CaseViewModel.Свойство IsCaseSelected всегда будет иметь значение false независимо от того, установлен флажок или нет. Однако, если я жестко закодирую html в родительском представлении вместо рендеринга частичного, то CaseViewModel.Свойство IsCaseSelected будет правильно установлено в соответствии с флажками.

Мой код показан ниже.

Форма, на мой взгляд, выглядит примерно так:

 <div class="form-group">
<div>
    <label for="ProfileName">Profile Name:</label>
    <input type="text" name="ProfileName"><br>
</div>

@Html.Partial("~/Views/Shared/_CasesSelection.cshtml", Model.Cases_Category1)

<div id="category2-cases">
    <p>category-2</p>
    <label for="select-all">Select all</label>
    <input id="select-all" type="checkbox" onclick="select_all_toggle(this)" />
    @for (int i = 0; i < Model.Cases_Category2.Count; i  )
    {
        @Html.Label(Model.Cases_Category2[i].CasesNumber.ToString())
        @Html.CheckBoxFor(model => model.Cases_Category2[i].IsCaseSelected)
    }
</div>

<div>
    <input type="submit" value="Create" class="btn btn-default" />
</div>
  

Мое частичное представление выглядит следующим образом:

 @model List<Models.CaseViewModel>

<div id="some-case">
    <p>some-case</p>
    <label for="select-all">Select all</label>
    <input id="select-all" type="checkbox" onclick="select_all_toggle(this)" />
    @for (int i = 0; i < Model.Count; i  )
    {
        @Html.Label(Model[i].CaseNumber.ToString())
        @Html.CheckBoxFor(model => model[i].IsCaseSelected)
    }
</div>
  

Модель, к которой она привязана, выглядит следующим образом:

 public class TestProfileVM
{
    [Required]
    [RegularExpression(@"^[a-zA-Z0-9-_] $")]
    public string ProfileName { get; set; }

    public List<CaseViewModel> Cases_Category1 { get; set; }
    public List<CaseViewModel> Cases_Category2 { get; set; }
}
  

И, наконец, CaseViewModel выглядит следующим образом:

 public class CaseVM
{
    public string CaseType { get; set; }
    public int CaseNumber { get; set; }
    public bool IsCaseSelected { get; set; }
}
  

Дополнительная информация:

Кроме того, в моем родительском представлении, когда я заменяю модель.case_category2[i] с моделью.case_category2.ElementAt(i), привязка работает некорректно. В чем причина этого, и может ли это быть связано с исходной проблемой? Спасибо.

Ответ №1:

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

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

Комментарии:

1. Привет, мо, проблема действительно в том, что имена флажков в моем частичном представлении не совпадают с именами в родительском представлении. Причина этого в том, что мои модели отличаются. Как я могу изменить свое частичное представление, чтобы изменить имя флажка, сохранив привязку? Новый {name=»name-here»} переопределяется реализацией Html. CheckBoxFor().

2. Передайте ViewModel на частичную страницу вместо передачи части ViewModel на частичную страницу.