Управление состоянием в ASP.NET MVC

Я создал приложение 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, но я все еще должен передать параметры тому объекту, таким образом, это не становится намного лучше.

Любые идеи ценятся.

7
задан Joe Capka 4 January 2010 в 16:08
поделиться

1 ответ

Использование состояния сеанса для такого рода вещей всегда неудобно, так как это означает, что эти страницы не могут быть закладками, и если вы хотите, чтобы было открыто более одной закладки, это начинает создавать беспорядок.

Вы можете создать новый класс 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") %>
1
ответ дан 7 December 2019 в 20:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: