如何在ASP.NET MVC中使用JQuery.Ajax传递多个参数

时间:2010-09-23 02:58:49

标签: c# asp.net-mvc asp.net-mvc-2 jquery

大家好我是JSon的新手,不太清楚如何传递数据。我使用ASP.NET MVC作为我的开发平台。

在视图中

 $(document).ready(function() {
    $("select#Colors").change(function() {
       var photoCategory = $("#Colors > option:selected").attr("value"); // 1st parameter
       var userID = $(".userID").attr("value"); // 2nd parameter         
       $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            url: "/FindPhotos/" + photoCategory ,
            data: "{}",
            dataType: "json",

            success: function(data) {
            $('#ProductsDiv > div').remove(); 
                if (data.length > 0) {
                    var options = ''; 
                } .......
       });
    });
});

在Global.asax中:

routes.MapRoute(
       "FindPhotos",
       "FindPhotos/{category}",
        new { controller = "Clinical", action = "FindPhotosByCategory", category = "" }
       );

所以一切正常,因为我只在$ .ajax网址中传递一个参数'photoCategory'。我现在的目标是传递第二个参数,即userID,所以我可以在下面的控制器方法中使用它们。

在控制器中:

 public JsonResult FindPhotosByCategory(string category, string userID) {

        List<PhotoSet> photoset = Repository.GetPhotoSetByUserID(userID);

        return new JsonResult
        {
             Data = (from p in photoset 
                     where p.PhotoCategory == category
                     select p).ToArray<PhotoSet>()
        };
    }

有谁知道如何编写$ .ajax()方法,以便我可以将2个参数传递给控制器​​?谢谢!

3 个答案:

答案 0 :(得分:5)

取决于您希望如何传递它。您正在进行GET,但您的路由不支持userId作为路由参数,因此您可以在查询字符串上传递它。 URL将是/ FindPhotos / lolcats?UserId = 123。

那就是说,你是想让这个人选择用户还是你打算使用当前登录用户的用户ID。如果是后者,我会争辩说你只是从控制器那里抓住它并保持路线清洁。

本着保持路线清洁的精神,我实际上将路线更改为以下内容:

routes.MapRoute( 
       "FindPhotos", 
       "FindPhotos/{category}/{userId}", 
        new { controller = "Clinical", action = "FindPhotosByCategory", category = "", userId=UrlParameter.Optional } 
       ); 

这将为您提供选项,使userId可选,然后根据是否提供过滤进行过滤。然后你的ajax调用变为:

   $.ajax({ 
        type: "GET", 
        contentType: "application/json; charset=utf-8", 
        url: "/FindPhotos/" + photoCategory + "/" + userId , 
        data: "{}", 
        dataType: "json", 

最后,它与JSON无关,而与调用URL的方式有关。再次,这是GET所以你可以把它传递给URL并且没问题。

在旁注 - 我确信你知道 - 为了安全起见,我会尽量避免将实际的用户ID放入标记或其他任何地方。如果必须这样做,请确保在代码的业务逻辑/数据访问部分内以某种方式保护访问权限。

答案 1 :(得分:3)

您可以在$ .ajax的数据参数中发送尽可能多的数据,如

$.ajax({
type: "GET", 
        contentType: "application/json; charset=utf-8", 
        url: "/FindPhotos/" + photoCategory, 
        data: {UserID = "34", UserName = "George", Key = "Value"}, 
        dataType: "json"

});

所有这些值都将作为路由值附加到查询字符串中。如果你想要路由值,那么是的,你必须为此写一个匹配的路由。

答案 2 :(得分:0)

我认为问题是你试图在你的控制方法(类别,UserId)中传递2个参数,但在你的路由中你只接受1,这是类别。

将路由更改为

routes.MapRoute(
       "FindPhotos",
       "FindPhotos/{category}/{userId}",
        new { controller = "Clinical", action = "FindPhotosByCategory", category = "", userId="" }
       );

或将您的控制方法更改为

public JsonResult FindPhotosByCategory(string category) {
//pass your userid from code behinde
....
}