我正在创建一个搜索页面,用户在文本框中键入并单击“搜索”,控制器将在其Action方法中使用FormCollection。ASP.Net MVC - 传递发布的值以查看
我做了搜索并将结果返回到视图,但是我想返回用户搜索到的视图。 TempData是这个最好的地方还是这是一个风险?
我正在创建一个搜索页面,用户在文本框中键入并单击“搜索”,控制器将在其Action方法中使用FormCollection。ASP.Net MVC - 传递发布的值以查看
我做了搜索并将结果返回到视图,但是我想返回用户搜索到的视图。 TempData是这个最好的地方还是这是一个风险?
使用视图模型创建强类型视图,该视图模型将所有您想要的信息传递给视图并对所有用户推测信息进行编码。
public class ResultsSetViewModel
{
public string Query { get; set; }
public IList<Result> Results { get; set; }
}
对用户推荐数据进行编码。
<h3>Search Results For: <%=Html.Encode(Model.Query) %></h3>
当动作的结果是重定向到另一个动作时,主要使用TempData,并且需要保持一定的状态。
您只需要在ViewData词典中添加另一个条目,其中包含“用户搜索的内容”。事情大致是这样的:
public ActionResult Search(FormCollection form)
{
// search algorithm
ViewData["keywords"] = form["keywords"];
return View();
}
的TempData的是,如果你的用户请求别的东西,下一次需要该项目。使用ViewData就是你要找的东西。另请记住,他/她搜索的值仍然可以在视图中作为Request[searchBoxName]
使用。
我想说你的模型的结果视图应该包含结果和搜索条件。
例子:
public class ResultsViewModel
{
public SearchModel SearchCriteria { get; set; }
...
}
public class SearchModel
{
public string Category { get; set; }
...
}
然后,只需填充SearchCriteria在结果视图模型,你可以从那里取回。
这假定您的结果视图是强类型为ResultsViewModel
。
使用上述两种建议都可以,但最好将您需要的数据添加到模型中,而不是通过ViewData传递。
如果您在模型中传递它,那么您将获得强类型化的好处,并且无需添加逻辑来将ViewData条目投射到您的视图中。
是的,这是如何做到这一点,如果你严格遵守强打字将数据传递到视图。 – 2009-12-02 21:16:21
+1 @tv。我发现人们仍然在使用ViewData来处理这些令人困惑的事情。对于应用程序的名称,或者类似的静态数据,但是对于活的可变更的东西来说,这非常棒? – griegs 2009-12-03 00:19:26