【发布时间】:2016-03-30 05:19:23
【问题描述】:
我有一个视图,其中将编辑与特定专辑相关的一组图像,以更改其描述并使其封面照片 em>。
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 在浏览器控制台中检查时具有数据。但它不会传递给控制器方法。
在浏览了几篇帖子后,我了解到当使用foreach 时,它会为List 中的多个记录创建重复的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 等,但没有一个能解决这个问题。
最终,我怎样才能将这个 模型列表 从
ajax传递给controller?
【问题讨论】:
-
您需要创建模型
IList<T>才能使用索引(或者最好使用自定义EditorTemplate(有关更多详细信息,请参阅this answer)。但是您的RadioButtonFor()没有意义 -你的意思是CheckBoxFor()? -
@StephenMuecke.. 期待你加入.. ;) 但是,它实际上是一个单选按钮,因为我只想要一张图片作为封面照片,并且当单击其中一个单选按钮时将被设置为禁用是我的想法和首选单选按钮组。这不是正确的选择吗?
-
但是您的代码只会为每个
EditImageViewModel生成一个单选按钮,没有会导致模型绑定失败的值属性(它会将null值提交给只接受@ 的属性987654357@ 或false)。而且由于每个组都有不同的组名,因此您可以选择所有组(但永远不要取消选择其中任何一个) -
$('form').serialize();可以正常工作。根据您显示的代码,模型不会是null(尽管只会绑定每个项目的ImageDes属性) -
@REDEVI_,OP 已经表示他已经尝试过
serializeArray()- 但.serialize()无论如何都是正确的使用方法
标签: c# ajax asp.net-mvc asp.net-mvc-4