我有一个由3个部分视图组成的视图 屏幕左侧和右侧顶部的2个部分。 每个人都有一个互斥的搜索,每个帖子都回到自己的行动
这是呈现初始视图的操作
public ActionResult Index() {
var model = new SearchOptionsViewModel();
return View(model);
}
这是其中一个局部视图的后期操作:
[HttpPost]
public ActionResult SearchByUser(UserSearchOptionsViewModel model) {
if(ModelState.IsValid) {
var list = SearchUserService.SearchByValue(model.LastName, model.Username, model.EmailAddress);
if(list != null) {
var resultsModel = new UserSearchResultsListViewModel();
list.ForEach(item => resultsModel.Users.Add(new UserSearchResultsViewModel(item)));
return RedirectToAction("SearchResults", resultsModel);
}
}
return View(model);
}
此模型成功发布并从数据库中获取数据并将其添加到viewmodel。 我迷失了如何在搜索条件下的同一屏幕上显示结果。
这是我希望通过先前操作接收模型并将部分渲染回原始视图的操作。我认为使用第三个SearchResults部分视图是答案,但这不起作用,它导航到它自己的页面显示结果而不是在同一页面上。
public ActionResult SearchResults(UserSearchResultsListViewModel model) {
return PartialView(model);
}
当我这样做时,模型总是以null形式出现。我在这里缺少一些基本的东西...... 如何在同一个视图中显示此数据?
答案 0 :(得分:1)
这就是我最终要做的事情。它感觉不完全干净,但我保持方法的责任最小。如果有人有更好的建议,我想在没有TempData的情况下更好地做到这一点,请发贴你的例子。
// Inital loaded view with 3 partial views
// 2 for search criteria, 1 for results
public ActionResult Index() {
var model = new SearchUsersViewModel();
if(TempData["model"] != null)
model = (SearchUsersViewModel)TempData["model"];
return View(model);
}
// Post the search criteria model for search
// by user data (by last name, etc...)
// Then redirect back to Index.
// TempData will have the full model with results populated
[HttpPost]
public ActionResult SearchByUser(FilterUsersByUserDataViewModel model) {
if(ModelState.IsValid) {
var list = SearchUserService.SearchByValue(model.LastName,
model.Username,
model.EmailAddress);
if(list != null) {
TempData["model"] = PrepareResultsModel(list);
return RedirectToAction("Index");
}
}
return View(model);
}
// This method just separates the concern of creating
//the new full model with search results populating the results view
private SearchUsersViewModel PrepareResultsModel(List<SearchUserViewDTO> list) {
var searchResults = new UserSearchResultsViewModel();
list.ForEach(item => searchResults.Users.Add(new UserViewModel(item)));
var model = new SearchUsersViewModel();
model.UserSearchResultsViewModel = searchResults;
return model;
}