Я создал приложение MVC ASP.NET некоторое время назад, и после того, как несколько циклов техобслуживания задаются вопросом, проявил ли я лучший подход к управлению состоянием. Все работает, но я получаю чувство, что существует лучший путь.
Сайт основан на функциональности поиска, которая имеет довольно много опций. Пользователь начинает использовать сайт путем заполнения многих параметров поиска в форме и нажимания 'поисковой' кнопки. Эта кнопка отправляет на Метод поиска со всеми параметрами поиска, определяемыми как параметры к Методам поиска, например:
public ActionResult Search(string param1, string param2, string param3, int? param3, long? param4)
Теперь страница результатов, которая обнаруживается, имеет много ссылок на него, ведя к различным страницам детали, и т.д. Так как мне нужно поисковое состояние, которое будет сохранено на странице детали, я создаю ActionLinks с большим количеством параметров повсеместно, таких как:
<%=Html.ActionLink("LinkText", "MethodName", new {id="idOfDetailPage", param1=Model.param1, param2=Model.param2, param3=Model.param3, param4=Model.param4}, null)%>
Большинство значений параметров в каждой ссылке не изменяется от текущего состояния поиска, но я должен передать их, чтобы смочь создать другие ссылки на странице детали с текущими поисковыми параметрами, такой как "назад к результатам поиска", например.
Когда я должен добавить поисковый параметр из-за запроса новой возможности, я изменяю много ссылок, а также любых методов Контроллера, к которым приводят ссылки. Это - то, где я чувствую, что мне нужен лучший путь.
Я думал об использовании состояния сеанса для хранения поисковых параметров, но по некоторым причинам думал, что это не было лучшей вещью использовать в ASP MVC и так любопытно, если существует другой, более чистый способ сделать это.
Примечание: Я также попробовал подход, где я использую объект со строгим контролем типов в ActionLink, но я все еще должен передать параметры тому объекту, таким образом, это не становится намного лучше.
Любые идеи ценятся.
Использование состояния сеанса для такого рода вещей всегда неудобно, так как это означает, что эти страницы не могут быть закладками, и если вы хотите, чтобы было открыто более одной закладки, это начинает создавать беспорядок.
Вы можете создать новый класс SearchParameters:
public class SearchParameters
{
public string Param1 { get; set; }
public string Param2 { get; set; }
}
модифицировать Action таким образом, чтобы он был
public ActionResult Search(SearchParameters params)
и затем передать его обратно в вид через данные вида. Тогда
ваш вид должен иметь возможность использовать
<%=Html.ActionLink("LinkText", "MethodName", Model) %>
Если вы используете это везде, вы можете создать расширение HtmlHelper:
public static class SearchExtensions
{
public static string SearchLink<TModel>(this HtmlHelper<TModel> helper, string linkText)
where TModel : SearchModel, class //required by ASP.NET MVC
{
return helper.ActionLink(linkText, "MethodName", modelType.ViewData.Model) %>
}
}
и тогда ваш поиск будет таким же простым, как:
<%=Html.SearchLink("LinkText") %>