代码之家  ›  专栏  ›  技术社区  ›  Joe Capka

ASP.NET MVC中的状态管理

  •  7
  • Joe Capka  · 技术社区  · 15 年前

    我在一段时间前构建了一个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)%>
    

    每个链接中的大多数参数值不会从搜索的当前状态更改,但我需要传递它们,以便能够在详细信息页中使用当前搜索参数创建其他链接,例如“返回搜索结果”。

    当我因为一个新的特性请求而需要添加一个搜索参数时,我发现自己修改了很多链接以及链接所指向的任何控制器方法。这就是我觉得我需要更好的方法的地方。

    我曾经考虑过使用会话状态来保存搜索参数,但出于某种原因,我认为这不是在ASP MVC中使用的最佳方法,因此我很好奇是否还有其他更干净的方法来实现这一点。

    注意:我还尝试了一种方法,在ActionLink中使用强类型的对象,但是我仍然需要将参数传递给该对象,这样它就不会变得更好。

    任何想法都会受到赞赏。

    1 回复  |  直到 12 年前
        1
  •  1
  •   kÍ©eÍ£mÍ®pÍ¥ Í©    15 年前

    使用会话状态处理这种事情总是很麻烦,因为这意味着这些页面不能加书签,如果你想打开多个选项卡,它就会变得混乱。

    可以创建新的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") %>