【问题标题】:Return partial view to same view将部分视图返回到同一视图
【发布时间】:2012-02-01 11:50:37
【问题描述】:

我有一个由 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);
    }

此模型成功发布并从数据库中获取我的数据并将其添加到视图模型中。 我不知道如何让结果显示在搜索条件下的同一屏幕上。

这是我希望能够从先前的操作接收模型并将部分渲染回原始视图的操作。我认为使用第三个 SearchResults 部分视图是答案,但这不起作用,它导航到它自己的页面显示结果而不是在同一页面上。

    public ActionResult SearchResults(UserSearchResultsListViewModel model) {
        return PartialView(model);
    }

当我这样做时,模型总是以 null 的形式出现。我在这里遗漏了一些基本的东西...... 如何让这些数据显示在同一个视图上?

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    这就是我最终要做的。它感觉并不完全干净,但我将方法的责任降至最低。如果有人有更好的建议,请发布您的示例。

        // 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;
        }
    

    【讨论】:

    • 看起来这是对唯一处理方法的共识,因为动作不能传递对象,只能传递原语。所以将其标记为已回答。
    • 但是如果 ModelState.IsValid 在您的第二种方法中为假怎么办?
    • ModelState 在帖子中的第一个方法中进行评估,这对我来说很重要,如果我将数据保存到数据库中,那就是另一回事了,但这只是从数据库中获取数据并分配给模型的属性并将其发送回
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多