2010-09-23 86 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" 

}); 

所有這些值將被追加到查詢字符串而不是路由值。如果你想要路線值,那麼你必須爲此寫一條匹配路線。

相關問題