#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 не сломается.