MVC 3 с ajax не выполняет привязку модели в действии контроллера - PullRequest
1 голос
/ 12 января 2011

Мое действие контроллера MVC 3 не десериализовывает данные JSON из моего поста AJAX.

  • Fiddler показывает, что данные передаются правильно.
  • Я поставил точку останова на переменную x = "ok!";и он попадает в нее каждый раз.
  • Когда contentType удаляется из .ajax(), объект адреса создается, но свойства имеют нулевые значения.
  • Если в запросе указан contentType,объект адреса имеет значение null.
  • Я пытался поместить [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; }
}

My 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-запрошено с: XMLHttpRequest
  • Accept-Language: en-us
  • Referer: http://localhost.:59872/Settings/Addresses?Length=8
  • Accept: application / json, text / javascript, * / *;q = 0,01
  • Тип содержимого: application / json;charset = utf-8
  • Accept-Encoding: gzip, deflate
  • Пользователь-агент: 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; Media 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
  • Соединение: Keep-Alive
  • Прагма:no-cache
  • Cookie: __RequestVerificationToken_Lw __ = IBBY7VzoqxMI .... (оставшаяся строка перерезана)
  • ASP.NET_SessionId = fsjywpn4gqasszgcdgmkqd4p
  • * 1066 "1066"":" 1 Main Street "," City ":" Beach City "," State ":" FL "," Zip ":" 99999 "}

1 Ответ

2 голосов
/ 19 января 2011

Проблема заключалась в том, что мне нужно было инкапсулировать возвращаемые данные в объект с именем «адрес», чтобы он соответствовал определению метода.Я передавал массив вместо объекта со свойствами.

Новый JSON =

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

в .ajax () - data: $ .toJSON (addressObj),

Старый JSON =

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

старый .ajax () имел - данные: $ .toJSON (адрес),

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

...