Вернуть частичное представление в то же представление - PullRequest
4 голосов
/ 01 февраля 2012

У меня есть вид, который состоит из 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);
    }

Модель всегда отображается как ноль, когда ясделай это.Я упускаю кое-что фундаментальное здесь ... Как мне заставить эти данные показывать в том же Представлении?

1 Ответ

1 голос
/ 01 февраля 2012

Я так и сделал.Это не кажется абсолютно чистым, но я держал обязанности методов минимальными.Я хотел бы иметь лучший способ сделать это без 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...