大家好我是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个参数传递给控制器?谢谢!
答案 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
....
}