将部分视图返回到同一视图

时间:2012-01-31 22:29:49

标签: asp.net-mvc-3

我有一个由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形式出现。我在这里缺少一些基本的东西...... 如何在同一个视图中显示此数据?

1 个答案:

答案 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;
    }