#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: слишком много символов в символьном литерале