2010-05-07 2 views
3

Маршрут:Ajax вызов с JQuery в ASP.NET MVC не передает параметры

routes.MapRoute(
    "Ajax", // Route name 
    "BizTalk/Services/{action}", // URL with parameters 
    new 
    { // Parameter defaults 
    controller = "BizTalk" 
    } 
    ); 

Мой контроллер:

public JsonResult AjaxTest(string s, int i, bool b) 
    { 
    return Json("S: " + s + "," + "I: " + i + "," + "B: " + b); 
    } 

Мой JQuery Код:

$(document).ready(function() { 
    $("#btn_test").click(function() { 
    var s = "test"; 
    var i = 8; 
    var b = true; 
    $.ajax({ 
    type: "POST", cache: false, 
    url: "/BizTalk/Services/AjaxTest", 
    data: { i: i, s: s, b: b }, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
    } 
    }); 
    }); 
    }); 

ответ

7

This пост объясняет проблему и возможные решения (подобно тому, как @Erv объяснил).

Если удалить contentType: "application/json; charset=utf-8" из вашего вызова jQuery.ajax типа содержимого по умолчанию (форма-urlencoded) будет использоваться и данные JSon вы указали в качестве параметра данных (data: { i: i, s: s, b: b }) будет правильно сопоставлена ​​с вашими параметрами действий ... .so, если вы действительно не хотите отправлять данные json, просто удалите contentType, и вы будете в порядке .....

+0

удаление контентаType сработал. но я хочу знать: 1 - если удаление contentType - это решение или небольшой трюк. 2- работает в каждом браузере. 3- и что не так? Я использовал приведенные выше коды в моем проекте WebForm просто отлично! – desmati

+0

@desmati no это не трюк ... данные только что завернуты в виде полей формы, которые отправляются по вызову ajax, тогда имена полей правильно отображаются/привязаны к параметрам вашего действия по структуре –

+0

Есть ли способ написать настраиваемое сопоставление параметров? – desmati

1

как вы поняли, что «jquery ... не передает параметры»? вы пытались нюхать запрос с помощью firebug?

Вы отправляете данные в тело POST, но пытаетесь получить к ним доступ обычным способом (с использованием аргументов действия), таких как GET.
все данные POST находятся в Request.Form, или вам придется обрабатывать его, привязывая к некоторым обычным ViewModel.

+0

Request.Form [0]: {"i": "8", "b": "test", "b": "true"} – desmati

+0

так? и что вы ожидали увидеть там? – zerkms

2

ASP.NET MVC автоматически не отображает входящие данные JSON в параметры метода действия.

в следующей статье для решения, чтобы добавить эту возможность:

http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

Кроме того, я думаю, что ваш вызов JQuery не на самом деле отправить JSON, хотя это, кажется, что вы хотите, чтобы это сделать. jQuery автоматически не преобразует объект data в JSON. Вам нужно преобразовать его в JSON самостоятельно с чем-то вроде json2.js

+0

входные данные здесь не json, вы ошибаетесь. – zerkms

+0

contentType: "application/json; charset = utf-8" устанавливает заголовок запроса, чтобы указать, что POST содержит JSON. –

+0

Спасибо. но я предпочитаю не использовать mvc2. – desmati

0

Erm, может быть, неправильно, но вы проходите в jQuery i, s, b, но в действии у вас есть s, i, b.

Порядок должен быть правильным для сообщений jQuery.

EDIT

Вот как я использую JQuery сообщения;

JQuery

 $.post("/Articles/jQueryAddComment", { commentText: commentText, id: id, type: commentType }, function(returnedHTML) { 
//Do something with the returned html. 
     }); 

В мой контроллер

 public ActionResult jQueryAddComment(string commentText, int id, string type) 
     { 
//do some stuff 
       return PartialView("CommentList", fvm); 
     } 
+0

omg%) Почтовые данные не проходят маршрутизацию, поэтому вы не можете обрабатывать их как параметры метода действия. – zerkms

+0

@zerkms, неуверенный, что на самом деле означает ваш комментарий. вы говорите, что вы не можете использовать маршрутизацию в сообщении jQuery? вы можете быть правы, я никогда не изучал эту возможность. если это не то, о чем вы могли бы рассказать? – griegs

+0

спасибо griegs, бит Приказ не имеет значения. и я использую $ .ajax. – desmati

Смежные вопросы