Список привязок к MVC Список объектов
У меня возникла проблема с привязкой модели, содержащей список объектов. Нет проблем, когда я пытаюсь передать данные с контроллера на представление, но когда я хочу отправить данные обратно, я получаю сообщение о том, что метод не существует.
Я использую вызов ajax, а в качестве данных я помещаю $form.serialize() и вижу список со всеми данными в скрипаче, но мне не повезло с привязкой.
Модель:
public class Single
{
public int Id {get;set;}
public string Name {get;set;}
public List<SimpleDropdown> dddl {get;set;}
public int SelectedEmp {get;set;}
}
public class MainModel
{
public List<Single> main_model_list {get;set;}
}
В моем контроллере теперь есть метод:
[HttpPost]
public string SaveModel(MainModel model)
{
return "";
}
Этот метод не вызывается, но когда я удаляю параметр, вызывающий работу. Поэтому я уверен, что привязка не работает. У меня была намного более сложная модель, но я упростил ее настолько, насколько могу, и до сих пор не мог заставить ее работать.
Итак, мой вопрос: как я могу проверить это, чтобы увидеть, в чем проблема?
Edit:
У меня нет кода на данный момент, но этот код является функциональным, потому что я использую его в других местах проекта. Это примерно так:
$("#form").submit(function( ) {
$.ajax({
url: "/Controller/SaveModel",
type: "POST",
data: $(this).serialize()
});
});
Форма выглядит примерно так:
@using (Html.BeginForm("SaveModel", "Home", FormMethod.Post, new { id = "form" }))
{
@for (var z = 0; z < ViewBag.groupes.Length; z++)
{
<div style="border-left: 1px solid black">
<h1>@ViewBag.groupes[z]</h1>
</div>
}
@for (var i = 0; i < Model.main_model_list.Count; i++)
{
<div>@Html.LabelFor(x => x.main_model_list[i].Id)</div>
<div>@Html.LabelFor(x => x.main_model_list[i].Name)</div>
<div style="float: left">@Html.DropDownListFor(x => main_model_list[i].SelectedEmp, new SelectList(main_model_list[i].dddl, "Id", "Value", main_model_list[i].SelectedEmp), new { @class = "preferences_dd_lists" })</div>
}
}
Ответы
Ответ 1
Вы можете попробовать использовать
@using(Ajax.BeginForm("SaveModel", "controller", formMethod.Post, new AjaxOptions{ }))
{
// your form
}
Не забудьте использовать jquery.unobtrusive-ajax.js
и с помощью Ajax.BeginForm вы можете удалить этот блок кода jQuery, чтобы отправить свою форму, и это делает вашу форму привязанной непосредственно в Action.
Ответ 2
Вы можете изменить свой код.
data:{ model:$(this).serialize()}
Поскольку вы не указываете имя параметра, привязка модели mvc не работает.
Ответ 3
Попробуйте следующее:
$("#form").submit(function( ) {
$.ajax({
url: "/Controller/SaveModel",
contentType: "application/json",
type: "POST",
data: $(this).serialize()
});
});
Ответ 4
при связывании связующего ищет идентификатор значения, который не был предоставлен вами.
поэтому добавьте это в цикле на странице просмотра
@Html.HiddenFor(x => x.main_model_list[i].Id)
Ответ 5
Я уверен, что вы неправильно написали html, вы хотите отправить коллекцию контроллеру, но ваша форма данных не соответствует вашей модели.
Я думаю, что если вы хотите отправить коллекцию своему контроллеру, вам нужно изменить свою html-форму
например:
<input type="hidden" name="main_model_list[0].Id" value="1 />
<input type="hidden" name="main_model_list[0].Name" value="xyz" />
<select name="main_model_list[0].SelectedEmp">
.....
</select>
<input type="hidden" name="main_model_list[1].Id" value="1 />
<input type="hidden" name="main_model_list[1].Name" value="xyz" />
<select name="main_model_list[1].SelectedEmp>
.....
</select>
.................
И я думаю, вы должны удалить List dddl из одной модели.
Ответ 6
Я выполнил ниже код, он работает нормально. Объявите модель (ы), как показано ниже
public class SimpleDropdown
{
//
// Summary:
// Gets or sets the text of the selected item.
//
// Returns:
// The text.
public string Text { get; set; }
//
// Summary:
// Gets or sets the value of the selected item.
//
// Returns:
// The value.
public string Value { get; set; }
}
public class SingleEntity
{
public int Id { get; set; }
public string Name { get; set; }
public List<SimpleDropdown> dddl { get; set; }
public int SelectedEmp { get; set; }
}
public class MainModel
{
public List<SingleEntity> main_model_list { get; set; }
}
И методы действия контроллера следующие
public class BasicController : Controller
{
public ActionResult GetModel()
{
MainModel mainModel = new MainModel();
List<SimpleDropdown> dropdownlist = new List<SimpleDropdown>();
List<SingleEntity> selist = new List<SingleEntity>();
for (int j = 1; j < 10; j++)
{
dropdownlist.Add(new SimpleDropdown { Text = "Text" + j, Value = j.ToString() });
}
SingleEntity se;
for (int i = 0; i < 10; i++)
{
se = new SingleEntity();
se.Id = i;
se.Name = "Name" + i;
se.SelectedEmp = i;
se.dddl = dropdownlist;
mainModel.main_model_list = selist;
mainModel.main_model_list.Add(se);
}
return View(mainModel);
}
[HttpPost]
public ActionResult SaveModel(MainModel mainModelasdfafsf)
{
// do stuff here... please not only selectedEmp only will get reflected but not the property ddl since its again another list
return View("GetModel");
}
}
И в конце вид должен выглядеть примерно так.
@model MvcDemo.Models.MainModel
@using (Html.BeginForm("SaveModel", "Basic", FormMethod.Post, new { id = "formModel" }))
{
for (var i = 0; i < Model.main_model_list.Count; i++)
{
<div>@Html.TextBoxFor(x => Model.main_model_list[i].Id)</div>
<div>@Html.TextBoxFor(x => Model.main_model_list[i].Name)</div>
<div>
@Html.TextBoxFor(x => Model.main_model_list[i].SelectedEmp)
</div>
<div style="float: left">
@Html.DropDownListFor(x => Model.main_model_list[i].SelectedEmp, new SelectList(Model.main_model_list[i].dddl, "Text", "Value", Model.main_model_list[i].SelectedEmp), new { @class = "preferences_dd_lists" })
</div>
}
<input type="button" value="Save" id="btnsave" name="btnsave" />
}
@section Scripts{
<script type="text/javascript">
$(document).ready(function () {
$('#btnsave').click(function () {
$.ajax({
async: false,
cache: false,
data: $('#formModel').serialize(),
url: '@Url.Action("SaveModel", "Basic")',
type: "POST",
dataType: "text/html",
success: function () {
alert('success');
},
error: function (errorThrown) {
debugger;
alert('something went wrong!!!');
}
});
});
});
</script>
}
Прежде всего убедитесь, что все файлы script загружены, а также Проверьте эту ссылку, где привязка модели не будет работать для Lable и LableFor