【问题标题】:MVC 3 with ajax not doing ModelBinding in Controller action带有 ajax 的 MVC 3 不在控制器操作中执行 ModelBinding
【发布时间】:2011-06-07 22:03:23
【问题描述】:

我的 MVC 3 控制器操作没有反序列化我的 AJAX 帖子中的 JSON 数据。

  • Fiddler 显示正确传递的数据。
  • 我在 var x = "ok!"; 上设置了一个断点。线,它每次都击中它。
  • .ajax() 中删除 contentType 时,会创建地址对象,但属性为空值。
  • 使用请求中的contentType,地址对象为空。
  • 我尝试将[DataContract][DataMembers] 放在我的POCO 上,没有区别
  • 我尝试使用IModelBinder,但StreamReader(Request.InputStream).ReadToEnd 始终是“”

这是 jQuery 代码:

 $("#home-validate-btn").click(function (event) {
    var address =
    {
        Address: $('#Data_HomeAddress').val(),
        City: $('#Data_HomeCity').val(),
        State: $('#Data_HomeState').val(),
        Zip: $('#Data_HomeZip').val()
    };

    $.ajax({
        url: '/Settings/addressValidate',
        type: 'POST',
        contentType: 'application/json; charset=utf-8', 
        dataType: 'json',
        data: $.toJSON(address),            
        success: function (info) {
            alert('ok!');
        }
    });
});

这是控制器代码:

 [AcceptVerbs(HttpVerbs.Post)]         
    public ActionResult addressValidate(ValidateAddress address)
    {
        var x = "ok!";
        return new JsonResult()
        {
            Data = (x),
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }

我的 POCO:

public class ValidateAddress
{        
    public string Address { get; set; }        
    public string City { get; set; }        
    public string State { get; set; }   
    public string Zip { get; set; }
}

我的 Global.asax.cs

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}", // URL with parameters
            new
            {
                controller = "Home",
                action = "Index"
            } // Parameter defaults
        );
    }

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
    }

这是来自 Fiddler 的数据:

  • POST http://localhost.:59872/Settings/addressValidate HTTP/1.1
  • x-requested-with: XMLHttpRequest
  • 接受语言:en-us
  • 引用:http://localhost.:59872/Settings/Addresses?Length=8
  • 接受:应用程序/json、文本/javascript、*/*; q=0.01
  • 内容类型:应用程序/json; charset=utf-8
  • 接受编码:gzip、放气
  • 用户代理:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1;WOW64;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;媒体Center PC 6.0;InfoPath.2;OfficeLiveConnector.1.5;OfficeLivePatch.1.3;.NET4.0C;.NET4.0E;Creative AutoUpdate v1.40.01;msn OptimizedIE8;ENUS)
  • 主机:localhost.:59872
  • 内容长度:77
  • 连接:保持活动状态
  • 编译指示:无缓存
  • Cookie:__RequestVerificationToken_Lw__=IBBY7VzoqxMI ....(字符串的其余部分被剪断)
  • ASP.NET_SessionId=fsjywpn4gqasszgcdgmkqd4p
  • {"Address":"1 Main Street","City":"Beach City","State":"FL","Zip":"99999"}

【问题讨论】:

    标签: asp.net-mvc json model-binding


    【解决方案1】:

    问题是我需要将返回数据封装在一个名为“address”的对象中以匹配方法定义。我传递的是一个数组而不是一个具有属性的对象。

    新 JSON =

    var addressObj = {
            address: {
                Address: $('#Data_HomeAddress').val(),
                City: $('#Data_HomeCity').val(),
                State: $('#Data_HomeState').val(),
                Zip: $('#Data_HomeZip').val()
            }
        };
    

    在 .ajax() 中 - 数据:$.toJSON(addressObj),

    旧 JSON =

    var address =
    {
        Address: $('#Data_HomeAddress').val(),
        City: $('#Data_HomeCity').val(),
        State: $('#Data_HomeState').val(),
        Zip: $('#Data_HomeZip').val()
    };
    

    旧的 .ajax() 有 - 数据:$.toJSON(address),

    http://forums.asp.net/p/1642394/4252987.aspx#4252987

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2014-04-04
      相关资源
      最近更新 更多