#asp.net-mvc-3 #asp.net-mvc-2
#asp.net-mvc-3 #asp.net-mvc-2
Вопрос:
Мне нужно создать ссылку, которая будет основана на моих критериях поиска. Например:
localhost/Search?page=2amp;Location.PostCode=XXamp;Location.Country=UKamp;IsEnabled=true
Параметры в этой ссылке — это значения свойств в моей SearchViewModel.
В идеале я хотел бы иметь что-то вроде:
@Html.ActionLink("Search","User", Model.SearchCriteria)
Поддерживается ли это по умолчанию или мне нужно передать свойства моей модели представления в объект типа RouteValueDictionary, а затем использовать это?
Моя цель — написать помощник подкачки, который будет генерировать номера страниц и добавлять параметры критериев поиска к сгенерированным ссылкам.
Например.
@Html.GeneratePageLinks(Model.PagingInfo, x => Url.Action("Index"), Model.SearchCriteria)
Я объединил ваши решения с предложением от PRO ASP.NET Книга MVC 3 и закончилась следующим:
Помощник для генерации ссылок. Интересной частью является параметр pageUrlDelegate, который позже используется для вызова Url.Action для генерации ссылок:
public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfoViewModel pagingInfo,
Func<int,String> pageUrlDelegate)
{
StringBuilder result = new StringBuilder();
for (int i = 1; i <= 5; i )
{
TagBuilder tagBuilder = new TagBuilder("a");
tagBuilder.MergeAttribute("href", pageUrlDelegate(i));
tagBuilder.InnerHtml = i.ToString();
result.Append(tagBuilder.ToString());
}
return MvcHtmlString.Create(result.ToString());
}
Затем в модели представления:
@Html.PageLinks(Model.PagingInfo, x => Url.Action("Index","Search", new RouteValueDictionary()
{
{ "Page", x },
{ "Criteria.Location.PostCode", Model.Criteria.Location.PostCode },
{ "Criteria.Location.Town", Model.Criteria.Location.Town},
{ "Criteria.Location.County", Model.Criteria.Location.County}
}))
)
Я все еще недоволен именами свойств в строках, но пока этого достаточно.
Спасибо 🙂
Ответ №1:
В идеале я хотел бы иметь что-то вроде:
@Html.ActionLink("Search","User", Model.SearchCriteria)
К сожалению, это невозможно. Вам нужно будет передавать свойства одно за другим. Вы действительно могли бы использовать перегрузку, которая требует RouteValueDictionary
:
@Html.ActionLink(
"Search",
"User",
new RouteValueDictionary(new Dictionary<string, object>
{
{ "Location.PostCode", Model.SearchCriteria.PostCode },
{ "Location.Country", Model.SearchCriteria.Country },
{ "IsEnabled", Model.IsEnabled },
})
)
Конечно, для этого, вероятно, лучше написать пользовательский помощник ActionLink:
public static class HtmlExtensions
{
public static IHtmlString GeneratePageLink(this HtmlHelper<MyViewModel> htmlHelper, string linkText, string action)
{
var model = htmlHelper.ViewData.Model;
var values = new RouteValueDictionary(new Dictionary<string, object>
{
{ "Location.PostCode", model.SearchCriteria.PostCode },
{ "Location.Country", model.SearchCriteria.Country },
{ "IsEnabled", model.IsEnabled },
});
return htmlHelper.ActionLink(linkText, action, values);
}
}
и затем:
@Html.GeneratePageLink("some page link text", "index")
Другая возможность состоит в том, чтобы передать только id
и заставить действие контроллера извлекать соответствующую модель и значения из того места, где вы изначально ее извлекли в действии контроллера, которое отображало это представление.
Комментарии:
1. Привет, Дарин, спасибо за твой ответ. Я, вероятно, воспользуюсь вашим вторым советом и создам помощник для генерации ссылок на страницы.
Ответ №2:
Вот некоторый код, взятый из примеров Tekpub Стива Сандерсона, который в целом является тем, что вы ищете. Сначала определите метод расширения для вашего объекта —
public static RouteValueDictionary DetailsRouteValues(this JobAd jobAd)
{
return new RouteValueDictionary
{
{ "controller", "Jobs" },
{ "action", "Details" },
{ "id", jobAd.JobAdId },
{ "country", MakeSimpleUrlSegment(jobAd.LocationCountry) },
{ "city", MakeSimpleUrlSegment(jobAd.LocationCity) },
{ "title", MakeSimpleUrlSegment(jobAd.Title) }
};
}
Затем вызовите Html.RouteLink
этот метод —
<%= Html.RouteLink(ad.Title, ad.DetailsRouteValues())%>
Комментарии:
1. Привет, спасибо за альтернативное решение. Мне нужно решить, правильно ли мне расширять критерии поиска с помощью метода для возврата значений маршрута. Мне нравится, чтобы мои модели представления были облегченными.