Управление состоянием в ASP.NET MVC - PullRequest
7 голосов
/ 04 января 2010

Некоторое время назад я создал приложение ASP.NET MVC, и после нескольких циклов обслуживания мне стало интересно, выбрал ли я лучший подход к управлению состоянием. Все работает, но я чувствую, что есть лучший способ.

Сайт основан на поисковой функции, которая имеет довольно много опций. Пользователь начинает использовать сайт, заполнив ряд параметров поиска в форме и нажав кнопку «поиск». Эта кнопка отправляет сообщение в метод поиска, при этом все параметры поиска определяются как параметры методов поиска, например:

public ActionResult Search(string param1, string param2, string param3, int? param3, long? param4)

Теперь на отображаемой странице результатов есть несколько ссылок, ведущих на различные страницы сведений и т. Д. Поскольку мне нужно сохранить состояние поиска на странице сведений, я создаю ссылки ActionLink с большим количеством параметров. над местом, например:

<%=Html.ActionLink("LinkText", "MethodName", new {id="idOfDetailPage", param1=Model.param1, param2=Model.param2, param3=Model.param3, param4=Model.param4}, null)%>

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

Когда мне нужно добавить параметр поиска из-за запроса новой функции, я обнаруживаю, что модифицирую множество ссылок, а также любые методы Controller, к которым ведут ссылки. Здесь я чувствую, что мне нужен лучший способ.

Я думал об использовании состояния сеанса для хранения параметров поиска, но по какой-то причине подумал, что это не лучшая вещь для использования в ASP MVC, и поэтому мне любопытно, есть ли другой, более чистый способ сделать это.

Примечание: я также попробовал подход, в котором я использую строго типизированный объект в ActionLink, но мне все еще нужно передать параметры этому объекту, чтобы он не стал намного лучше.

Любые идеи приветствуются.

1 Ответ

1 голос
/ 04 января 2010

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

Вы можете создать новый класс SearchParameters:

public class SearchParameters
{
    public string Param1 { get; set; }
    public string Param2 { get; set; }
}

измените свое Действие на

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") %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...