Как я должен обрабатывать URL-адреса MVC Asp.net в вызовах JavaScript? - PullRequest
5 голосов
/ 24 ноября 2010

Я пытаюсь написать тяжелую часть моего веб-приложения Asp.net MVC на javascript (эта часть веб-сайта представляет собой RIA с использованием Extjs). Тем не менее, я остановился на правильном способе обработки URL-адресов в JavaScript.

Например, сейчас у меня есть Ajax-вызов к действию List в ObjectsController, которое находится в области Reading. Действие List принимает параметр documentId (int). На данный момент это соответствует /Reading/Objects/List, так как я еще не изменил маршрутизацию (на данный момент сайт слишком молод, чтобы завершить маршруты). Обычно, чтобы поместить этот URL в строку, я бы сделал @Html.Action("List", "Objects", new { area = "Reading", documentId = 3).

Однако, это не работает при работе с javascript, так как javascript не анализируется в viewengine.

Чтобы обойти это, у меня есть очень маленькое представление, которое возвращает константы javascript, такие как URL, которые загружаются до файлов js моего основного приложения. Проблема в том, что я не могу вызвать Html.Action для этого действия, потому что при постоянном времени создания я (очевидно) не знаю, каким documentId будут ajax-вызовы, и если вы исключите documentId из вызова Html.Action исключение происходит. DocumentId может измениться во время нормального рабочего процесса приложения.

Как мне справиться с этим? Я не хочу жестко задавать URL-адрес для /Reading/Objects/List, потому что, если я изменю свою маршрутизацию для этого (для более удобного для пользователя json API) или это веб-приложение не будет размещено в корне домена, URL-адрес не будет дольше быть действительным.

Как все остальные обрабатывают URL-адреса MVC в своих вызовах JavaScript?

Ответы [ 3 ]

6 голосов
/ 08 декабря 2010

Вот безопасная техника, которую я использовал. Даже если ваш маршрут изменится, ваш JavaScript будет автоматически соответствовать новому маршруту:

<script>
var url = '@Url.Action("List", "Objects", new { area = "Reading", documentId = "_documentId_")';
var id = 100;
var finalUrl = url.replace('_documentId_', id);
</script>

"_documentId_" по сути является фиктивным заполнителем. Затем внутри моего JavaScript я заменяю «_documentId_» на правильное значение идентификатора, как только узнаю, что это такое. Таким образом, независимо от того, как настроен ваш маршрут, ваш URL будет соответствовать.


Обновление: 20 декабря

Я только что увидел этот интересный пост в блоге. Автор создал библиотеку, которая позволяет вам строить маршруты внутри вашего файла JavaScript с поддержкой intellisense в VisualStudio.

http://weblogs.asp.net/zowens/archive/2010/12/20/asp-net-mvc-javascript-routing.aspx

2 голосов
/ 24 ноября 2010

Лично я использую ненавязчивый javascript и не смешиваю разметку с javascript.AJAX-вызовы обычно запускаются нажатием на некоторые кнопки или ссылки:

@Html.ActionLink("click me", "List", "Objects", 
    new { area = "Reading", documentId = 3 }, new { id = "foo" })

, а затем в отдельном js-файле, который я бы прикрепил и обработал событие onclick (пример с jquery):

$(function() {
    $('#foo').click(function() {
        $('#resultDiv').load(this.href);
        return false;    
    });
});

Как вы можете, мне не нужно было использовать какой-либо жестко закодированный URL в моем файле javascript.URL-адреса всегда должны обрабатываться механизмом маршрутизации и генерироваться с помощью html-помощников.

Если бы это была <form> вместо ссылки, я бы просто обработал событие onsubmit (таким же образом) и использовал бы формуaction атрибут для получения URL.


ОБНОВЛЕНИЕ:

После указания в разделе комментариев, что идентификатор документа известен только на стороне клиента, вы можете сделать это:

@Html.ActionLink("click me", "List", "Objects", 
    new { area = "Reading" }, new { id = "foo" })

А потом:

$(function() {
    $('#foo').click(function() {
        $('#resultDiv').load(this.href, { documentId: '123' });
        return false;    
    });
});
0 голосов
/ 08 декабря 2010

Оказывается, все это было решено с помощью Url.Action() вместо Html.Action().Url.Action() (пока) позволяет мне генерировать URL без всех параметров.Я предполагаю, что это работает только тогда, когда маршрут не указывает параметры в самом целевом URL.

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