【问题标题】:Pass IEnumerable model to controller through ajax通过 ajax 将 IEnumerable 模型传递给控制器
【发布时间】: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);.

上面返回的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 在控制器中将始终是nullformdata 在浏览器控制台中检查时具有数据。但它不会传递给控制器​​方法。

在浏览了几篇帖子后,我了解到当使用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 1Post 2 等,但没有一个能解决这个问题。

最终,我怎样才能将这个 模型列表ajax 传递给 controller?

【问题讨论】:

  • 您需要创建模型IList&lt;T&gt; 才能使用索引(或者最好使用自定义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


【解决方案1】:

如果你想向控制器发布一个集合,你需要为你的名字添加索引。否则 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>
}

【讨论】:

  • 是.. 但是model 必须是IList 而不是IEnumerable@Html.TextAreaFor@Html.RadioButtonFor 而不是上面2 个html 控件.. 请更新相同的..
  • 我没有使用辅助方法来表明需要索引:)。如果需要,您仍然可以使用辅助方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2020-01-09
  • 1970-01-01
  • 2019-07-16
  • 2014-02-10
相关资源
最近更新 更多