2010-09-23 178 views
2

嗨,大家好,我是JSon的新手,不太清楚如何传递数据。我正在使用ASP.NET MVC作为我的开发平台。如何在ASP.NET MVC中使用JQuery.Ajax传递多个参数

在查看:

$(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 = "" } 
     ); 

所以一切工作正常这种方式,因为我只路过一个参数, 'photoCategory',在$ .ajax网址中。我现在的目标是传递第二个参数,它是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>() 
     }; 
    } 

有谁知道怎么写$。阿贾克斯()方法,这样我就可以在2个参数到控制器传递?谢谢!

回答

5

取决于你想如何传递它。你正在做一个GET,但你的路由不会支持userId作为路由参数,所以你可以将它传递给查询字符串。 URL将是/ FindPhotos/lolcats?UserId = 123。

也就是说,你想让人选择用户还是打算使用当前登录用户的用户ID。如果是后者,我会争辩说,你只需从控制器中获取并保持路线清洁。

在保持路线干净的精神,我想真正改变路线是类似以下内容:

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

这将使你做用户id可选,然后的选项根据是否滤波或者不提供。您的阿贾克斯电话然后变成:

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

最后,它与JSON和所有与您如何调用URL无关。再次,这是GET,所以你可以传递它的URL,并罚款。

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

+0

嗨,非常感谢您的帮助。关于在URL中拥有UserID的安全性,我同意你的看法。有没有办法在global.asax中使用路由表来掩盖用户ID?还是有更好的方法隐藏它? – Ari 2010-09-23 06:54:30

+0

它是当前登录用户的ID吗? – andymeadows 2010-09-24 05:20:55

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 
.... 
} 
3

如u想在$的数据参数,您可以发送尽可能多的数据。ajax like

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

}); 

所有这些值将被追加到查询字符串而不是路由值。如果你想要路线值,那么你必须为此写一条匹配路线。

相关问题