Информация о маршрутизации MVC, необходимая на клиенте?

#javascript #asp.net-mvc

#javascript #asp.net-mvc

Вопрос:

Мне нужна информация о маршрутизации для моей логики javascript на клиенте. У меня есть работоспособное решение прямо сейчас, но оно кажется немного неуклюжим. Я добавляю скрытое поле на страницу. Я думаю, что должен быть лучший способ. Это то, что я сейчас делаю:

 <input type="hidden" id="rt" value="@string.Format("{0}://{1}{2}",Request.Url.Scheme,Request.Url.Authority,Url.Content("~"))"/>
  

Ответ №1:

Да, очень неуклюжий. На самом деле вам не нужны абсолютные URL-адреса для вашего javascript. Он может работать с относительными URL-адресами. Например:

 @Html.Hidden("rt", Url.Content("~/"))
  

Теперь, является ли использование скрытого поля хорошей вещью или нет, можно сказать, не зная более подробной информации о вашем сценарии и о том, что именно вы пытаетесь сделать в javascript. Но давайте рассмотрим очень распространенный сценарий. Вы хотите преобразовать форму в AJAX. В этом случае вы бы использовали помощники HTML в своем представлении для создания формы, а затем:

 $(function() {
    $('#myform').submit(function() {
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function(result) {
                // TODO: do something with the results
            }
        });
        return false;
    });
});
  

Посмотрите, как нам больше не нужны никакие жестко закодированные URL-адреса или скрытые поля для javascript.

Или давайте рассмотрим другой сценарий. Вы хотите преобразовать якорь в AJAX. То же самое. Вы используете Html.ActionLink для создания своего якоря, а затем:

 $(function() {
    $('#mylink').click(function() {
        $.get(this.href, function(result) {
            // TODO: do something with the results
        });
        return false;
    });
});
  

Или еще один сценарий. У вас есть некоторый контейнер div, который вы хотите отправить AJAX-запрос на какое-либо действие контроллера при нажатии на него. В этом случае вы могли бы использовать данные HTML5-* атрибуты в div:

 <div id="mydiv" data-url="@Url.Action("Foo", "Home")">Some contents</div>
  

и затем:

 $(function() {
    $('#mydiv').click(function() {
        $.get($(this).data('url'), function(result) {
            // TODO: do something with the results
        });
        return false;
    });
});
  

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

Комментарии:

1. Спасибо Дарину за ответ. Я пытался устранить скрытое поле, хотя. Ввод скрытого поля на странице — единственный способ?

2. @user127954, нет, вам не нужны скрытые поля. Есть способы получше. Это будет зависеть только от того, что вы пытаетесь сделать на стороне клиента.

3. В значительной степени я просто использую ее в своем javascript для базового URL-адреса моего сайта, поэтому, когда он меняется, мне не нужно менять свой javascript (не хочу жестко кодировать URL-адреса).

4. @user127954, как я уже сказал, вашему javascript не нужен абсолютный URL, и, как я уже сказал, есть способы получше. Это будет зависеть от того, где и как вам это нужно. Вы говорите, что используете ее в своем javascript для базового URL, но вопрос в том, где она вам нужна? Я показал вам в своем ответе различные сценарии, в которых вам на самом деле никогда не нужен такой базовый URL в вашем javascript. Вы просто ненавязчиво улучшаете некоторый уже существующий элемент DOM, который уже содержит правильный URL, сгенерированный на сервере с помощью помощников url, так что, если ваши маршруты изменятся, ваш javascript не сломается.