Передача параметра из представления в контроллер через jquery в MVC 2 - PullRequest
1 голос
/ 17 августа 2010

Мне нужно передать строку url из представления в контроллер, URL-адрес, который получен с помощью jquery. Я попытался просто использовать параметр id в маршрутизации по умолчанию, но это не сработало. Он не принял строку URL.

Вызов контроллера через jquery работает нормально, например:

$('#result').load('Home/Files/' + url);

Это вызывает правильный метод действия, но если я не передам простую текстовую строку, это не сработает (я проверил подачу переменной url простой строкой, просто чтобы убедиться, что метод был вызван вообще).

Так как я могу получить эту строку URL в контроллер? Я пытаюсь думать о том, как сделать это способом «MVC», и не нарушать этот способ мышления, поэтому я не хочу использовать скрытый ввод с сервером runat. Может ли это быть сделано с ViewData? Я никак не мог придумать, я знаю только, как установить ViewData в контроллере и получить значение из представления, а не наоборот ...

Я также попытался добавить собственный маршрут (до маршрута по умолчанию):

routes.MapRoute(
    "FileManager", // Route name
    "Home/{action}/{url}", // URL with parameters
    new { controller = "Home", action = "Files", url = "" } // Parameter defaults
);

Но это тоже не сработало, та же проблема с невозможностью получить URL-адрес контроллера. Я сделал это только потому, что видел предложения для людей с похожими проблемами, но, честно говоря, я не понимаю, как это может работать, потому что чем это отличается от маршрута по умолчанию? Я понятия не имею, почему параметр {id}, кажется, принимает только определенные строки (я полагаю, строки формата id), но пока я не могу указать, каким именно типом должен быть параметр url, я не вижу, как добавление этого маршрута должно иметь какое-то значение ...

Если бы кто-то мог просветить меня, я был бы очень благодарен!

EDIT: Когда я думаю об этом, так как я получаю контент через ajax-вызов с jquery, я не уверен, что решение типа ViewData все равно будет работать, потому что вся страница не опубликована, или я ошибаюсь? Имейте в виду, что на данный момент я только изучаю MVC и jquery, поэтому, пожалуйста, не думайте, что у меня еще есть все основы, понятные мне :-). По сути, я просто хочу иметь возможность передавать любой тип строки (и, возможно, другие типы данных, которые не являются идентификаторами) в контроллер из представления ...

РЕДАКТИРОВАТЬ 2: Я попробовал предложенный encodeURIComponent, но это тоже не сработало, если я что-то не так делаю. Вот мой код:

URL-адрес (не имеет значения, пробую ли я его как относительный или абсолютный, используя file: ///)

<li><a href="#" rel="visual studio 2010/Projects/JsTree/JsTree/">Some text</a>

JQuery:

var url;
$(document).ready(function () {
    $("a").click(function () {
        url = encodeURIComponent($(this).attr("rel"));
        $('#result').load('Home/Files/' + url);
    });
});

Я вызываю метод действия с параметром идентификатора строки. Еще раз обратите внимание, что он работает нормально, если я передаю простую строку и выполняется вызов действия. Но если я использую URL выше, метод действия никогда даже не вызывается ... У меня есть точка останова, которая никогда не достигается, если в параметре есть URL!

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Скорее всего, URL-адрес закодирован неправильно - попробуйте использовать encodeURIComponent ().

Еще один совет - сгенерировать URL-адрес действия с использованием самой маршрутизации MVC - URL.ForAction () IIRC. Таким образом, если вы когда-либо измените информацию о маршрутизации, весь ваш JQuery продолжит работать

0 голосов
/ 17 августа 2010

Попробуйте кодировать URL-адрес, прежде чем передать его через encodeURICompoenent(), например:

$('#result').load('Home/Files/' + encodeURIComponent(url));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...