ASP.NET MVC中的状态管理

7
我之前建立了一个ASP.NET MVC应用程序,经过几个维护周期后,我想知道我是否采用了最佳状态管理方法。虽然一切都正常,但我感觉有更好的方法。
该网站基于具有多个选项的搜索功能。用户通过在表单中填写多个搜索选项并单击“搜索”按钮来开始使用该网站。此按钮将所有搜索选项作为参数定义到Search方法中进行提交,例如:
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个回答

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

只要我始终传递相同的搜索参数,并且只传递搜索参数给动作(例如搜索动作),这个方法就能正常工作。然而,当我需要向动作传递额外的数据时,比如一个项目的ID(比如详细页面),我就会遇到麻烦。这时,我不能简单地将模型传递给Html.ActionLink辅助方法。此外,许多链接需要更改其中一个搜索参数,但其他参数保持不变,所以采用这种方法后,我需要不断创建新的SearchParameters对象。虽然它能正常工作,但随着时间的推移,会变得混乱不堪。 - Joe Capka
3
我会介入并建议书签搜索并不总是一个好的功能,这取决于上下文和应用程序,如果搜索有未在参数中公开的依赖关系,则尤其如此。尽管如此,我认为这是一个好的概括(-: - Murph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接