У меня есть мнение, где множество изображений, относящихся к определенному альбому будет отредактировано, чтобы изменить их описания и сделать их крышка фото.Pass IEnumerable модели контроллер через AJAX
EditImageViewModel.cs
public class EditImageViewModel
{
public int ImageId{get;set;}
public string ImageUrl{get;set;}
public string ImageDes{get;set;}
public bool IsCoverPic{get;set;}
}
От одного из контроллера ActionResult
, я вернусь к model
view
, как return PartialView("_ImageEditView",model);
.
model
вернулся вышеList<EditImageViewModel>
Теперь в окне я отобразить его, как показано ниже:
_ImageEditView.cshtml
@model IEnumerable<EditImageViewModel>
@using(Html.BeginForm("UpdateImage","Controller",FormMethod.Post))
{
@foreach(var image in Model)
{
<img src="@image.ImageUrl"/>
@Html.TextAreaFor(m=>image.ImageDes)
@Html.RadioButtonFor(m=>image.IsCoverPic)
}
<button type="submit" class="update" value="Update"></button>
}
У меня есть ajax
кусок кода который вызывает ActionResult
, как показано ниже:
$('.update').on('click',function(e){
e.preventDefault();
var url=$(this).closest('form').attr('action');
var formdata=$(this).closest('form').serialize();
$.ajax({
url:url,
data:formdata,
type:'POST',
dataType:'JSON',
success:function(resp){
},
error:function(resp){
}
})
});
Мой контроллер ActionResult
выглядит следующим образом:
[HttpPost]
public ActionResult UpdateImage(List<EditImageViewModel> model)
{
//actions to be performed
}
Моя проблема здесь не важно, на что, model
всегда будет находиться в контроллере null
, когда происходит запись. formdata
с данными при проверке в консоли браузера. Но он не передается методу контроллера.
Пройдя несколько сообщений, я узнал, что он создает дубликаты идентификаторов для нескольких записей в List
, когда используется foreach
. Так что я изменил его на for
петлю, как показано ниже:
@model IEnumerable<EditImageViewModel>
@using(Html.BeginForm("UpdateImage","Controller",FormMethod.Post))
{
@for(int i=0;i<Model.Count();i++)
{
<img src="@Model[i].ImageUrl"/>
@Html.TextAreaFor(m=>m[i].ImageDes)
@Html.RadioButtonFor(m=>m[i].IsCoverPic)
}
<button type="submit" class="update" value="Update"></button>
}
Но все-таки model
является нулевым, когда они получены в контроллере. Я также пробовал использовать serializeArray
вместо serialize
, но это не помогло. Я упомянул несколько сообщений, таких как Post 1
, Post 2
и т. Д., Но ни одна из них не решила эту проблему.
В конце концов, как я могу передать этот список Model от
ajax
кcontroller
?
Вам нужно сделать модель '' IList для того, чтобы использовать индексацию (или предпочтительно использовать пользовательские 'EditorTemplate' (см [этот ответ] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943 # 30094943), но ваш 'RadioButtonFor()' не имеет смысла - вы имели в виду 'CheckBoxFor()'? –
@StephenMuecke. Ожидало, что вы заглянете внутрь.;) Однако на самом деле это переключатель, так как я хочу только одно изображение в качестве обложки, и когда один из переключателей будет нажат, остальные будут отключены, это то, что я имел в виду и предпочтительная группа переключателей. Разве это не правильный вариант? –
Но ваш код будет генерировать только один переключатель для каждого 'EditImageViewModel' без атрибута значения, который приведет к сбою привязки модели (он отправит значение« null »в свойство, которое принимает только« true »или« false ») , И поскольку у каждого из них есть другое имя группы, вы можете выбрать все из них (но никогда не снимать с себя ни одного из них) –