ASP.NET MVC中的状态管理

Joe*_*pka 7 asp.net asp.net-mvc

我前段时间已经构建了一个ASP.NET MVC应用程序,经过几个维护周期后,我想知道我是否采用了最佳的状态管理方法.一切正常,但我觉得有更好的方法.

该网站基于搜索功能,有很多选项.用户通过填写​​表单中的多个搜索选项并单击"搜索"按钮来开始使用该站点.此按钮发布到Search方法,所有搜索选项都被定义为Search方法的参数,例如:

public ActionResult Search(string param1, string param2, string param3, int? param3, long? param4)
Run Code Online (Sandbox Code Playgroud)

现在显示的结果页面上有许多链接,导致各种详细信息页面等.由于我需要在详细信息页面上保留搜索状态,我发现自己创建了ActionLinks,其中包含大量参数, 如:

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

每个链接中的大多数参数值都不会从搜索的当前状态发生变化,但我需要传递它们才能在详细信息页面中使用当前搜索参数创建其他链接,例如"返回搜索"结果"例如.

当我因新功能请求而需要添加搜索参数时,我发现自己修改了许多链接以及链接所导致的任何Controller方法.这是我觉得我需要更好的方式.

我曾考虑使用会话状态来保存搜索参数,但出于某种原因认为这不是在ASP MVC中使用的最好的东西,所以很好奇是否有另一种更清洁的方法来执行此操作.

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

任何想法都表示赞赏.

Dav*_*emp 1

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

您可以创建一个新的 SearchParameters 类:

public class SearchParameters
{
    public string Param1 { get; set; }
    public string Param2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

将您的 Action 修改为

public ActionResult Search(SearchParameters params)
Run Code Online (Sandbox Code Playgroud)

然后通过视图数据将其传递回视图。

然后你的视图应该能够使用

<%=Html.ActionLink("LinkText", "MethodName", Model) %>
Run Code Online (Sandbox Code Playgroud)

如果您到处使用它,您可能想创建一个 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) %>
    }       
}
Run Code Online (Sandbox Code Playgroud)

然后您的搜索就很简单:

<%=Html.SearchLink("LinkText") %>
Run Code Online (Sandbox Code Playgroud)

  • 我将继续坚持下去,并建议书签搜索并不总是一件好事 - 它而是取决于上下文和应用程序 - 如果搜索具有未公开的依赖项,则尤其如此。参数。也就是说,我认为这是一个很好的概括(-: (3认同)