Asp.net mvc — просмотр контроллера, список равен нулю

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

Моя модель:

 public class AdminPageModel
{
    public int? JobID { get; set; }

    [DisplayName("Description")]
    public string Description { get; set; }

    [DisplayName("Weight")]
    public decimal Weight { get; set; }

    public int ID { get; set; }        
}
  

Форма 1:

 using (Html.BeginForm("EditTemplate", "Config", FormMethod.Post, new { @class = "form-horizontal" }))
{
    for (var i = 0; i < Model.Count; i  )
    {
        <div class="form-group">
        @if (Model[i].JobID != null)
        {
            @Html.LabelFor(m => m[i].Description)
            @Html.TextBoxFor(m => m[i].Description)

            @Html.LabelFor(m => m[i].Weight)
            @Html.TextBoxFor(m => m[i].Weight)

            @Html.HiddenFor(m => m[i].ID)
            @Html.HiddenFor(m => m[i].JobID)
            <br />@Html.ActionLink("Delete", "DeleteTemplate", new { id = @Model[i].ID, jobID = selectedJobID })
        }

        </div>
    }
    <input type="submit" value="Update" class="btn btn-success" id="editSubmit" />
}
  

Форма 2:

 using (Html.BeginForm("EditCompetency", "Config", FormMethod.Post, new { @class = "form-horizontal" }))
{
    for (var i = 0; i < Model.Count; i  )
    {
        <div class="form-group">
            @if (Model[i].JobID == null)
            {
                @Html.LabelFor(m => m[i].Description)
                @Html.TextBoxFor(m => m[i].Description)

                @Html.LabelFor(m => m[i].Weight)
                @Html.TextBoxFor(m => m[i].Weight)

                @Html.HiddenFor(m => m[i].ID)
                @Html.HiddenFor(m => m[i].JobID)
                <br />@Html.ActionLink("Delete", "DeleteCompentency", new { id = @Model[i].ID})
            }

        </div>
    }
    <input type="submit" value="Update" class="btn btn-success" id="editSubmit" />

}
  

Контроллеры:

 [HttpPost]
public ActionResult EditCompetency(List<AdminPageModel> modelList)
{
    // stuff
}

[HttpPost]
public ActionResult EditTemplate(List<AdminPageModel> modelList)
{
    // stuff
}
  

Вот в чем проблема. У меня есть шаблоны и компетенции. Я могу добавлять / удалять весь день. При попытке редактирования возникает проблема.

С шаблонами вообще нет проблем, только с компетенциями. Если я добавляю компетенцию, а шаблона не существует, редактирование работает просто отлично. Но если шаблон существует, когда я пытаюсь отредактировать компетенцию, List<AdminPageModel> modelList (тип, для которого строго типизирован мой вид) отображается как null. Если я удалю шаблон, я смогу отредактировать компетенцию по своему усмотрению. Я потратил часть этого утра на то, чтобы разобраться с этим.

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

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

2. Они действительно находятся на одной странице.

3. Можете ли вы попробовать поместить их на отдельные страницы? Или, в качестве альтернативы, сделайте так, чтобы ваша viewmodel для страницы включала два списка: один для шаблонов и один для дополнений. Затем привяжите эти два списка к соответствующим формам. Прямо сейчас вы, по сути, привязываете одни и те же данные к двум формам. Если это не имеет смысла для вас, я могу написать некоторый код в ответе.

4. пример был бы полезен, если вы не возражаете.

5. Я только что добавил пример для вас. Дайте мне знать, если это полезно.

Ответ №1:

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

ConfigController.cs

 [HttpGet]
public ActionResult Index()
{
    AdminViewModel viewModel = // Get Data Somehow
    return View(viewModel);
}

[HttpPost]
public ActionResult EditCompetency(AdminViewModel viewModel)
{
    // access competency data with viewModel.Competencies
}

[HttpPost]
public ActionResult EditTemplate(AdminViewModel viewModel)
{
    // access template data with viewModel.Templates
}
  

AdminViewModel.cs (новый класс)

 public class AdminViewModel
{
    public List<AdminPageModel> Templates { get; set; }
    public List<AdminPageModel> Competencies { get; set; }
}
  

AdminPage.cshtml

 @model AdminViewModel

using (Html.BeginForm("EditTemplate", "Config", FormMethod.Post, new { @class = "form-horizontal" }))
{
    for (var i = 0; i < Model.Templates.Count; i  )
    {
        <div class="form-group">
        @if (Model.Templates[i].JobID != null)
        {
            @Html.LabelFor(m => m.Templates[i].Description)
            @Html.TextBoxFor(m => m.Templates[i].Description)

            @Html.LabelFor(m => m.Templates[i].Weight)
            @Html.TextBoxFor(m => m.Templates[i].Weight)

            @Html.HiddenFor(m => m.Templates[i].ID)
            @Html.HiddenFor(m => m.Templates[i].JobID)
            <br />@Html.ActionLink("Delete", "DeleteTemplate", new { id = @Model.Templates[i].ID, jobID = selectedJobID })
        }

        </div>
    }
    <input type="submit" value="Update" class="btn btn-success" id="editSubmit" />
}

using (Html.BeginForm("EditCompetency", "Config", FormMethod.Post, new { @class = "form-horizontal" }))
{
    for (var i = 0; i < Model.Competencies.Count; i  )
    {
        <div class="form-group">
            @if (Model.Competencies[i].JobID == null)
            {
                @Html.LabelFor(m => m.Competencies[i].Description)
                @Html.TextBoxFor(m => m.Competencies[i].Description)

                @Html.LabelFor(m => m.Competencies[i].Weight)
                @Html.TextBoxFor(m => m.Competencies[i].Weight)

                @Html.HiddenFor(m => m.Competencies[i].ID)
                @Html.HiddenFor(m => m.Competencies[i].JobID)
                <br />@Html.ActionLink("Delete", "DeleteCompentency", new { id = @Model.Competencies[i].ID})
            }

        </div>
    }
    <input type="submit" value="Update" class="btn btn-success" id="editSubmit" />

}