【问题标题】:MVC4 Form Serialize to controller not workingMVC4表单序列化到控制器不起作用
【发布时间】:2013-03-19 03:46:35
【问题描述】:

我已经尝试了几乎所有方法来使用 ajax 将表单发送回我的控制器。

我已将模型简化为字符串。

  • ajax 正在正确提取所有表单数据。
  • 我也有 serilaizeArray()。

我的模型对象每次都是空的(其他参数映射得很好,即页面,排序......)。 我错过了什么?

阿贾克斯:

...
var model = $('#advancesearchform').serialize();
var request = $.ajax({
    type: "POST",
    url: "/DAM/Home/_ImageSearchResult",
    cache: false,
    traditional: true,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    data: JSON.stringify({
        page: page,
        itemsperpage: itemsperpage,
        sort: sort,
        sortdir: sortdir,
        model: model
    }),
    success: function (data) {
        $('#imagesearchresults').html(data);
    }
});

JSON.stringfy :
{\"page\":null,\"itemsperpage\":8,\"sort\":\"Project\",\"sortdir\":\"ASC\",\"model\":\"FileName =123&OriginalFileName=sas&Height=asas&Width=asas&DepartmentId=9b4463cd-c184-e211-9244-005056887208&ClassId=28de9d15-c284-e211-9244-005056887208\"}

控制器:

[HttpPost]
public PartialViewResult _ImageSearchResult(int? page, int itemsperpage, string sort, string sortdir, AdvanceSearchFilters model)
{
}

型号:

public class AdvanceSearchFilters
{
    public string FileName { get; set; }
    public string OriginalFormat { get; set; }
    public string Width { get; set; }
    public string Height { get; set; }
    public string MediaSource { get; set; }
    public string DepartmentId { get; set; }
    public string ClassId { get; set; }
    public string ThemeId { get; set; }
}

【问题讨论】:

    标签: jquery ajax asp.net-mvc razor asp.net-mvc-4


    【解决方案1】:

    问题在于您发送的数据格式不正确。 当你调用 $('#advancesearchform').serialize();数据被格式化为查询字符串,但您告诉 ajax 发送 JSON。有了这个:

    {
     "page":null,
     "itemsperpage":8,
     "sort":"Project",
     "sortdir":"ASC",
     "model":"FileName=123&OriginalFileName=sas&Height=asas&Width=asas&DepartmentId=9b4463cd-    c184-e211-9244-005056887208&ClassId=28de9d15-c284-e211-9244-005056887208"
    } 
    

    您将“模型”作为字符串发送。您需要做的是将您的高级搜索表单属性转换为 json 格式并将它们附加到当前 JSON 或将所有内容作为查询字符串发送。

    对于第一个,快速解决方案是

    $.ajax({
      type: "POST",
      url: "/DAM/Home/_ImageSearchResult",
      cache: false,
      traditional: true,
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',
      data: JSON.stringify({
        page: page,
        itemsperpage: itemsperpage,
        sort: sort,
        sortdir: sortdir,
        model: {
            FileName: $("#FileName").val(),
            OriginalFormat: $("#OriginalFormat").val()
            and so on...
    

    对于第二个,你可以做类似的事情

    $.ajax({
      type: "POST",
      url: "/DAM/Home/_ImageSearchResult",
      data: $('#advancesearchform').serialize() + "&page=" + page + "&itemsperpage=" + itemsperpage + "&sort=" + sort + "&sortdir=" +sortdir
    

    【讨论】:

      【解决方案2】:

      查看您的代码,AdvanceSearchFilters 类有一个名为 OriginalFormat 的属性,而序列化表单的值为 OriginalFileName

      我还建议从非 ajax 方法开始。如果您可以在非 js 环境中正确回发值,那么您就知道问题与 ajax 相关。

      如果元素上的名称值不正确,则模型绑定器无法正确映射它们。例如AdvanceSearchFilters.HeightHeight 相对应

      【讨论】:

      • 我已经知道它与 ajax 相关的问题。我可以做一个帖子,它映射得很好。我需要做一个 ajax 帖子,以便我可以在返回时提取部分视图。另一方面,绑定应该跳过不存在的名称并写入其他名称。
      【解决方案3】:

      首先,尝试看这里:JSON.Stringify examples
      或者,您可以使用 $("form").serialize() 来序列化您的数据。

      $.ajax({ 
      url: "....",
      method: "POST",
      data: $("form").serialize()
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 2015-04-17
        相关资源
        最近更新 更多