通过ajax

时间:2016-03-30 05:19:24

标签: c# ajax asp.net-mvc asp.net-mvc-4

我有一个视图,其中与某些相册相关的图像集将被编辑以更改其 描述 并使其 封面照片 即可。

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);

  上面返回的

modelList<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

1 个答案:

答案 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>
}