2010-01-04 7 views
7

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

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

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)%> 

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

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

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

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

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

ответ

1

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

Вы можете создать новый класс 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") %> 
+0

Это работает, пока я всегда передаю одни и те же параметры поиска и только параметры поиска для действия ион, например, действие поиска. Однако у меня возникают проблемы, когда мне нужно передать дополнительные данные в действие, например, идентификатор элемента (как для подробной страницы).Тогда я не могу просто передать модель методу html.ActionLink. Кроме того, для многих ссылок требуется, чтобы один из параметров поиска был изменен, а остальное оставалось неизменным, поэтому при таком подходе мне нужно продолжать создавать новые объекты SearchParameters. Он работает, но через некоторое время становится беспорядочным. –

+3

Я собираюсь вставить свое весло и предлагаю, чтобы поиск по закладкам не всегда был удачным - это скорее зависит от контекста и приложения - это особенно верно, если в поиске есть зависимости, которые не отображаются в параметрах. Я сказал, что это хорошее обобщение (-: – Murph