Сгенерировать ссылку в jQuery, используя ASP.NET MVC Url.Action

#jquery #asp.net-mvc #caching #url-rewriting

#jquery #asp.net-mvc #кэширование #переписывание URL

Вопрос:

Я генерирую список ссылок следующим образом:

 $('#latestNews').append('<li><a href="<%= Url.Action("Details", "Article") %>/'   key   '">'   val   '</a></li>');
  

И на индексной странице ссылка выглядит следующим образом:

 <a href="/En/Article/Details/6">Title</a>
  

Но на странице /Ru/Article/Details/6 сгенерированная ссылка выглядит так:

 <a href="/En/Article/Details/6/6">Title</a>
  

Я пробовал $('#latestNews').append('<li><a href="<%= Url.Action("Details", "Article") %>?id=' key '">' val '</a></li>'); , все работает нормально, но тогда кэширование не работает.

Мой код контроллера:

 [OutputCache(Duration = Int32.MaxValue, VaryByParam = "id,language", SqlDependency = "database:Articles")] //Articles will be added rarely so i think it'll be nice to cache them
public ActionResult Details(string id, string language)
{..}
  

Мой маршрут:

 routes.MapRoute(
                "Default", 
                "{language}/{controller}/{action}/{id}",
                new { language = "En", controller = "Home", action = "Index", id = UrlParameter.Optional } 
            );
  

Итак, как сгенерировать URL-адрес лучшим способом?

ОБНОВЛЕНО:

  $.post('<%= Url.Action("GetLatest", "News") %>', function (data) {               
                $.each(data, function (key, val) {
                    $('#latestNews').append('<li><%= Url.ActionLink(val, "Details", "Article", new { id = key }, null) %></li>');                    
                });
                $('#news').show();
            }, "json");
  

Ответ №1:

Ваши переменные key и val находятся в JavaScript, так что это не будет работать с помощником Url. Вы могли бы изменить свой скрипт, чтобы он выглядел примерно так:

РЕДАКТИРОВАТЬ: исправлена ошибка — изменен {id = null} на {id = String.Пусто }

  $.post('<%= Url.Action("GetLatest", "News") %>', function (data) {               
                $.each(data, function (key, val) {
                    $('#latestNews').append('<li><a href="<%= Url.Action("Details", "Article", new { id = String.Empty}) %>/'   key  '">'   val   '</a></li>');                    
                });
                $('#news').show();
            }, "json");
  

Итак, метод MVC Url.Action() просто выдает вам первую часть url. Затем jQuery добавит key в конец URL-адреса и добавит val в качестве текста для привязки во время выполнения.

Я думаю, что это самый простой способ сделать это без слишком большого рефакторинга кода.

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

1. Извините, но я делаю это прямо сейчас, это 2-я строка моего вопроса. Проблема в том, что когда я перехожу к URL страницы сведений.Действие выдает /Ru/Article/Details/6 /key = /Ru/Article/Details/6 / 6

2. Я отредактировал приведенный выше код, чтобы передать значение маршрута {id = null}. Ваша проблема возникает из-за того, что Url.Action () будет использовать текущее значение «id» на странице сведений.

3. присвоение null приводит к CS0828: невозможно присвоить <null> свойству анонимного типа. Итак, я изменил его на new {id = String. Пусто} . Спасибо!

Ответ №2:

Лучший способ сгенерировать ссылку — передать идентификатор непосредственно методу Action (а не добавлять его вручную). Еще лучше использовать ActionLink вместо метода Action:

 $('#latestNews').append('<li><%= Url.ActionLink(val, "Details", "Article", new { Id = key }, null) %></li>');
  

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

1. отображается сообщение об ошибке компилятора: CS0103: имя ‘val’ не существует в текущем контексте

2. Замените val текстом ссылки

3. Я получаю ключ, значения val с сервера, посмотрите, пожалуйста, на мой запрос $.post. Я должен добавлять эти значения динамически. Я попробовал $ (‘#LatestNews’).append(‘<li><%= Url.ActionLink(‘ val ‘, «Details», «Article», new { id = ‘ key ‘}, null) %></li>’); и он показывает сообщение об ошибке компилятора: CS1012: слишком много символов в символьном литерале