我正在开发Asp.net MVC中的代码项目。我在完成操作后重定向用户时遇到问题。我有这些控制器:
索引搜索页面:
public ActionResult Index(){
//this method sets up viewmodel data for search preferences
Viewmodel obj = new Viewmodel();
//set values of dropdowns and searching capabilities
return View("Search", obj);
}
然后用户填写视图中的搜索框,选择下拉列表。这将返回一个处理数据的帖子搜索方法:
[HttpPost]
public ActionResult Index(Viewmodel obj, int? page)
{
data = from i in db.Database
select i;
if(!String.IsNullOrEmpty(obj.Example)
{
data = data.Where(x => x.poss == obj.poss);
}
//PAGING and other data formatting here
return View("Results", data);
}
显示结果列表后,我在结果视图中有一个复选框/按钮系统,允许用户选择多个结果并将其标记为" Good"," Bad"等等。这是一种非常简单地更改数据库的方法。我的问题是,在数据库改变数据后,我不知道如何将用户返回到他们所在的确切结果集。返回void的方法不起作用,并且参数不是分开的(一个整个视图模型),因此我不能简单地保存URL并将它们返回到唯一的URL。我想保持viewmodel作为参数。如何保存包含其搜索偏好的viewmodel数据以供稍后使用,以及页码,而不将我的方法更改为:
[HttpPost]
public ActionResult Index(string dropdown1, string dropdown2, int num......){}
答案 0 :(得分:1)
我做的一件事是将视图模型保存到会话中。然后我在索引方法中反序列化。索引方法中有类似的东西:
[HttpGet]
public ActionResult AdvancedSearch()
{
HttpContext currentContext = System.Web.HttpContext.Current;
AdvancedSearchViewModel advancedSearchViewModel = (AdvancedSearchViewModel)Session["AdvancedSearchViewModel"];
if (advancedSearchViewModel == null)
{
advancedSearchViewModel = new AdvancedSearchViewModel();
AddAdvancedSearchLists(advancedSearchViewModel, currentContext);
}
return View(advancedSearchViewModel);
}
以下是在帖子中保存到会话的一些代码:
Session["AdvancedSearchViewModel"] = advancedSearchViewModel;
请注意,如果您有列表框(下拉菜单和多选),则必须在post方法中重建列表框并重新选择选择(对于多选)。 HTML是无状态的。 MVC不会将列表框内容发送回帖子上的服务器,它只发送所选内容。
答案 1 :(得分:1)
您可以使用TempData来实现此目的。
在POST Index操作中将ViewModel和Page存储在TempData中。用于接受和存储数据库中的结果状态(即好,坏等等)的操作方法将能够从TempData访问ViewModel和Page,因为它是下一个立即请求。数据库操作完成后,只需使用RedirectToAction,并在TempData中显示ViewModel和Page。
如果更新结果状态的操作不是下一个立即请求,那么您需要将数据保存在BGStack应答的会话中。