У меня очень большая форма в моем приложении с множеством разных входов и множеством списков в моей модели. Поэтому я попытаюсь добавить/удалить списки без отправки полной модели на сервер.Связать динамически созданный элемент с сложной моделью mvc in view
Я пробовал несколько способов, но я не нашел чистого пути. Вы можете представить себе мою модель:
public class EditSomething
{
public string name { get; set;}
public List<something> somethingList { get; set;}
// a lot other fields...
public EditSomething(EditSomethingFromDatabase editSomethingFromDatabase)
{
name = editSomethingFromDatabase.Name;
somethingList = new List<SomethingModel>();
foreach(var something in editSomethingFromDatabase.Something)
{
somethingList.Add(new SomethingModel(editSomethingFromDatabase.Something));
}
}
}
Другая модель выглядит аналогично, но без списков.
В представлении У меня есть таблица для модели:
<h2>Something</h2>
<div id="SomethingDiv">
<table id="SomethingTable">
<thead>
<tr>
<th>@Html.Label("SomethingName")</th>
<th>@Html.Label("SomethingID")</th>
<th></th>
</tr>
</thead>
<tbody id="SomethingTableBody">
@Html.EditorFor(x => x.somethingList)
</tbody>
</table>
<p>
<input type="button" name="addSomething" value="Add Something" id="AddSomething">
</p>
</div>
JQuery из addSomething является: метод
$('#AddSomething').click(function() {
$.ajax({
url: '@Url.Action("AddSomething", "SomethingModels")',
data: { tableSize: $('#SomethingTable tr').length },
cache: false,
success: function (html) { $('#SomethingTable tr:last').after(html); }
});
Контроллер AddSomething является:
public ActionResult AddSomething (int tableSize)
{
SomethingModel something= new SomethingModel(null, (-2) * (tableSize + 1));
return PartialView(""~/Views/EditorTemplates/EditSomethingModel.cshtml"", something);
}
И по крайней мере, у меня есть редакторский шаблон в EditorTemplates, как и для редактора и частичного просмотра. Это имеет важные информации я хочу, чтобы отправить на сервер:
@model SomethingModel
<tr>@TextBoxFor(m=>m.SomethingName)<td>
@TextBoxFor (м => m.SomethingID)
Итак, проблема теперь в том, что представить на первый взгляд только после SomethingModel
на сервере, который уже существовал при открытии представления, но новый SomethingModel из метода AddMutation
не был в сообщении. У кого-то есть идея исправить это?
Редактировать: Изменен путь к шаблону редактора, поэтому мне нужен только один вид для EditorFor
и PartialView
.
Редактировать 2: Чтобы решить основную проблему, я создал представление как следующее и использую его как частичный вид. Теперь данные отправляются на сервер правильно. Только проверка на стороне клиента по-прежнему не работает:
@model SomethingModel
<tr>@TextBoxFor(m=>m.SomethingName, new{Name="somethingList["+ViewBag.ListId+"].SomethingName")<span class="field-validation-valid" data-valmsg-for="somethingList[@ViewBag.ListId].SomethingName" data-valmsg-replace="true"></span><td>
<tr>@TextBoxFor(m=>m.SomethingID, new{Name="somethingList["+ViewBag.ListId+"].SomethingID")<span class="field-validation-valid" data-valmsg-for="somethingList[@ViewBag.ListId].SomethingID" data-valmsg-replace="true"></span><td>
</tr>
В методе AddSomething
я добавил ViewBag.ListId
с идентификатором следующего элемента в списке.
Я изменил мой ответ с изменением вам нужно сделать, чтобы получить ненавязчивую проверку на работайте со своими новыми полями после обратного вызова ajax. –
Да, это видно. Но вам нужно удалить все проверки из формы, которую вы хотите отправить. Это будет работать: var table = '$ ('# SomethingForm'). RemoveData (" validator "). RemoveData (" unobtrusiveValidation "); $ .validator.unobtrusive.parse (таблица); 'Большое спасибо –