前段时间我已经构建了一个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)%>
每个链接中的大多数参数值都不会从搜索的当前状态发生变化,但我需要传递它们才能在详细信息页面中使用当前搜索参数创建其他链接,例如“回到搜索结果“例如。
当我因新功能请求而需要添加搜索参数时,我发现自己修改了许多链接以及链接所导致的任何Controller方法。这是我觉得我需要更好的方式。
我已经考虑过使用会话状态来保存搜索参数,但出于某种原因认为这不是在ASP MVC中使用的最好的东西,所以我很好奇是否有另一种更清晰的方法来执行此操作。
注意:我也尝试了一种方法,我在ActionLink中使用强类型对象,但我仍然需要将参数传递给该对象,因此它没有好多了。
任何想法都表示赞赏。
答案 0 :(得分: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") %>