Экранированные символы в URI, сгенерированные при вызове URL. Действие с помощью jQuery Script - PullRequest
5 голосов
/ 07 января 2012

У меня есть следующий код как часть скрипта jquery для открытия диалога jqueryui (значение id жестко запрограммировано для целей тестирования):

        open: function (event, ui) {

            $(this).load("@Url.Action("Edit", "Person",
                new
                {
                    id = Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"),
                    selectedPersonFor = Model.SelectedPersonFor,
                    selectedPersonForId = Model.SelectedPersonForId,
                    clientAccountId = Model.ClientAccountId
                })");
        },

Проблема в том, что, несмотря на то, что мой диалог открывается, действие контроллера никогда не срабатывает.

Если я просматриваю источник в своем браузере, получается:

open: function (event, ui) {

            $(this).load("/Person/Edit/28769371-7518-49db-a5ea-b9c62621a609?selectedPersonFor=ClientAccount&selectedPersonForId=2a2dd3b9-a73b-4afa-8237-5a4f37736f8a&clientAccountId=00000000-0000-0000-0000-000000000000");
        },

Я обнаружил, что, если я жестко закодировал указанный выше URI в своем скрипте и заменил экранированный амперсанд (&) на не экранированный амперсанд (&), то мое действие контроллера попадет под удар.

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

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

Может кто-нибудь подсказать мне, как преодолеть эту проблему?

Дополнительная информация:

Я также попытался передать параметры запроса в функцию загрузки следующим образом:

open: function (event, ui) {

            $(this).load("@Url.Action("Edit", "Person")",
                {
                    id: @Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"),
                    selectedPersonFor: Model.SelectedPersonFor,
                    selectedPersonForId: Model.SelectedPersonForId,
                    clientAccountId: Model.ClientAccountId
                });
        },

Однако, когда я делаю это таким образом, мой диалог даже не открывается.

Edit:

В ответ на запрос показать маршрут я предоставляю следующее (надеюсь, это то, что запрашивалось):

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

Я просто использую маршруты по умолчанию, предоставленные моим проектом asp.net mvc3.

1 Ответ

7 голосов
/ 07 января 2012

В Razor оператор @ используется для HTML-кодирования вывода => & становится &. Если вы не хотите, чтобы это произошло, вы можете использовать помощник Html.Raw:

var url = '@Html.Raw(Url.Action("Edit", "Person", new {
    id = Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"),
    selectedPersonFor = Model.SelectedPersonFor,
    selectedPersonForId = Model.SelectedPersonForId,
    clientAccountId = Model.ClientAccountId
}))';
$(this).load(url);

Теперь давайте рассмотрим ваш второй фрагмент кода:

$(this).load("@Url.Action("Edit", "Person")", {
    id: @Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"),
    selectedPersonFor: Model.SelectedPersonFor,
    selectedPersonForId: Model.SelectedPersonForId,
    clientAccountId: Model.ClientAccountId
});

Если вы посмотрите на визуализированный HTML, вы увидите следующее:

$(this).load("@Url.Action("Edit", "Person")", {
    id: 28769371-7518-49db-a5ea-b9c62621a609,
    selectedPersonFor: Model.SelectedPersonFor,
    selectedPersonForId: Model.SelectedPersonForId,
    clientAccountId: Model.ClientAccountId
});

, который, очевидно, не работает, поскольку Model.SelectedPersonForId, вероятно, не является допустимой переменной javascript, поэтому вы получаете ошибку javascript. Также 28769371-7518-49db-a5ea-b9c62621a609 не является допустимым выражением JavaScript, поскольку вы не заключили его в кавычки.

Если вы хотите, чтобы это работало, убедитесь, что вы генерируете правильное содержимое:

$(this).load("/Person/Edit", {
    id: '@Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609")',
    selectedPersonFor: '@Model.SelectedPersonFor',
    selectedPersonForId: '@Model.SelectedPersonForId',
    clientAccountId: '@Model.ClientAccountId'
});

Обратите внимание на оператор @, используемый перед каждой серверной переменной, а не только перед Guid. Также обратите внимание, что значения заключены в строки javascript.

...