2016-03-30 2 views
0

У меня есть мнение, где множество изображений, относящихся к определенному альбому будет отредактировано, чтобы изменить их описания и сделать их крышка фото.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, я вернусь к modelview, как 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?

+0

Вам нужно сделать модель '' IList для того, чтобы использовать индексацию (или предпочтительно использовать пользовательские 'EditorTemplate' (см [этот ответ] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943 # 30094943), но ваш 'RadioButtonFor()' не имеет смысла - вы имели в виду 'CheckBoxFor()'? –

+0

@StephenMuecke. Ожидало, что вы заглянете внутрь.;) Однако на самом деле это переключатель, так как я хочу только одно изображение в качестве обложки, и когда один из переключателей будет нажат, остальные будут отключены, это то, что я имел в виду и предпочтительная группа переключателей. Разве это не правильный вариант? –

+0

Но ваш код будет генерировать только один переключатель для каждого 'EditImageViewModel' без атрибута значения, который приведет к сбою привязки модели (он отправит значение« null »в свойство, которое принимает только« true »или« false ») , И поскольку у каждого из них есть другое имя группы, вы можете выбрать все из них (но никогда не снимать с себя ни одного из них) –

ответ

0

Если вы хотите отправить коллекцию контроллеру, вам нужно будет добавить указатели на свое имя. В противном случае MVC не знает, как привязать модель.

Например

@model IEnumerable<EditImageViewModel> 
@using(Html.BeginForm("UpdateImage","Controller",FormMethod.Post)) 
{ 
    @for(int i=0;i<Model.Count();i++) 
    { 
     <img src="@Model[i].ImageUrl"/> 
     <textarea name="@string.Format("ImageDes[{0}]", i)">@Model[i].imageDes</textarea> 
     <input type="radio" name="@string.Format("IsCoverPic[{0}]", i)" value="@Model[i].IsCoverPic" > 

    } 
    <button type="submit" class="update" value="Update"></button> 
} 
+0

Да .. Но 'model' должен быть' IList' вместо 'IEnumerable' и' @ Html.TextAreaFor' и '@Html .RadioButtonFor' вместо выше 2 'html' элементов управления .. Пожалуйста, обновите то же самое. –

+1

Я не использовал вспомогательные методы, чтобы указать, что необходим индекс :). Вы все еще можете использовать вспомогательные методы, если хотите – iBoonZ

+0

Прохладный .. Спасибо много еще раз .. –

Смежные вопросы