我有一个视图,其中与某些相册相关的图像集将被编辑以更改其 描述 并使其 封面照片 即可。
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
中为多条记录创建重复的ID。所以我将其更改为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
等,但没有一个能解决这个问题。
最终,我如何将{strong>列表中的模型从
ajax
传递给controller
?
答案 0 :(得分: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>
}