#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" />
}