Как передать несколько аргументов, используя JQuery.Ajax в ASP.NET MVC - PullRequest
2 голосов
/ 23 сентября 2010

Привет, ребята, я новичок в 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 = "" }
       );

Таким образом, все работает нормально, так как я передаю только один параметр, photoCategory, в URL-адресе $ .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>()
        };
    }

Кто-нибудь знает, как написать метод $ .ajax (), чтобы я мог передать 2 параметра в контроллер?спасибо!

Ответы [ 3 ]

5 голосов
/ 23 сентября 2010

Зависит от того, как вы хотите передать его.Вы выполняете GET, но ваш маршрут не будет поддерживать userId в качестве параметра маршрута, поэтому вы можете передать его в строке запроса.URL-адрес будет /FindPhotos/lolcats?UserId=123.

При этом вы хотите, чтобы пользователь выбрал пользователя, или вы собираетесь использовать идентификатор пользователя, вошедшего в систему в данный момент.Если это последнее, я бы поспорил, что вы просто берете это из контроллера и сохраняете маршрут чистым.

В духе поддержания маршрута чистым, я бы фактически изменил маршрут на что-то вроде следующего:

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-адресу и все будет в порядке.

На заметку - и, как я уверен, вы знаете - я постараюсь не указывать фактического пользователяидентификаторы в разметке или где-либо еще в этом отношении в целях безопасности.Если вам нужно это сделать, убедитесь, что вы каким-то образом защищаете доступ в пределах частей вашего кода, связанных с бизнес-логикой / доступом к данным.

3 голосов
/ 23 сентября 2010

Вы можете отправить столько данных, сколько хотите, в параметре данных $ .ajax, например

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

});

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

0 голосов
/ 23 сентября 2010

Я думаю, что проблема в том, что вы пытаетесь передать 2 аргумента в вашем методе управления (категория, UserId), но при маршрутизации вы принимаете только 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
....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...