Форма MVC 3 для публикации и сохранения данных модели - PullRequest
27 голосов
/ 01 мая 2011

Я думаю, что мне не хватает некоторых принципов работы форм MVC.У меня есть форма поиска на моей домашней странице, которая имеет пять или шесть различных полей, по которым пользователь может искать.Так что у меня есть этот пост для моих результатов действий просто отлично.Действие Result выглядит следующим образом:

[HttpPost]
public ActionResult Results(SearchModel model)
{
    ResultsModel results = new ResultsModel();
    results.ResultList = SearchManager.Search(model).ToList();

    return View("Results", results);
}

Я упростил приведенный выше метод для этого поста, но идея та же.Так что все это прекрасно работает.Моя страница результатов отображается со списком результатов, и мой пользователь находится по следующему адресу:

http://www.site.com/results

Итак ... теперь я хочу сделать что-то довольно распространенное.У меня есть два выпадающих списка на странице результатов."Сортировать по" и "# результатов на страницу".Как мне это сделать и отправить полный набор данных модели обратно на контроллер, чтобы я мог запросить новые параметры?В действительности класс SearchModel имеет около 60 различных полей.Потенциально все эти данные могут содержаться в модели.Как вы сохраняете это на странице «назад»?

Этот же вопрос меня немного озадачил, как сделать пейджинг.Мои ссылки на пейджинг отправляются по URL-адресу, например:

http://www.site.com/results/2

Но это предполагает, что мы отвечаем на запрос GET (я не хочу 60 полей данных в строке запроса) и что данные модели передаются между запросами GET, что, как я знаю, не так.

Как я уже сказал, я думаю, что мне не хватает некоторых основ работы с MVC 3, моделями и постами форм.

Может кто-нибудь помочь указать мне правильное направление здесь?Я буду рад отредактировать / обновить этот пост по мере необходимости, чтобы прояснить ситуацию.

РЕДАКТИРОВАТЬ : Я также хотел бы отметить, что я хотел бы избежать сохранения модели представления вПеременная сеанса.Этот сайт в конечном итоге будет сбалансирован по нагрузке в веб-ферме, и я действительно стараюсь по возможности избегать использования Session.Однако, если это единственная альтернатива, я настрою другого поставщика состояния сеанса, но я бы предпочел этого не делать.

Ответы [ 4 ]

16 голосов
/ 01 мая 2011

Вы можете добавить свои текущие параметры SearchModel к значениям маршрута для вашей формы. Несколько версий BeginForm позволяют передавать объект / RouteValuesDictionary.

@Html.BeginForm("Action", "Controller", new { SearchModel = Model }, FormMethod.Post)

Это должно передать ваши текущие значения SearchModel, чтобы вы могли повторно использовать их для перехода на следующую страницу. Вам необходимо определить действие контроллера, которое будет принимать любые значения формы текущей страницы, а также SearchModel.

Я не делал этого с постами в форме, но из того, что я сделал, и из того, что написано в документах, я бы начал с этого. Конечно, это также означает, что каждая из «ссылок» на вашей странице должна содержать посты. Это действительно неудобно для пользователей, если они хотят иметь возможность использовать кнопку «Назад» в браузере.

В этом контексте вы можете попытаться определить маршрут, который позволяет номеру страницы отображаться как часть URL - «Действие / Контроллер / {страница}». Тем не менее, я не уверен, как это будет работать, учитывая, что форма делает сообщение.

Ответ на комментарий:

Да, вы можете использовать Route Values, чтобы добавить SearchModel к каждой ссылке на страницу, но, как я сказал в комментарии выше, так как ссылки сделают «get», ваши пользователи увидят SearchModel, сериализованную как часть ссылка.

В любом случае, использование значений маршрута является вашим ответом на возврат вашей первоначальной модели SearchModel без использования скрытых полей, Session или TempData.

8 голосов
/ 02 мая 2011

Ваш класс SearchModel должен содержать ваши критерии поиска и ваши результаты.Что-то вроде ниже.Если вы используете PagedList для своих результатов, он будет содержать текущую страницу, общее количество страниц, общее количество элементов и т. Д. Вы можете ограничить объем информации на своей странице, только написав критерии поиска, которые содержат значения.

public class SearchModel
{
    public string Product { get; set; }
    public string Sku { get; set; }
    public string Size { get; set; }
    public string Manufacturer { get; set; }
    // etc...

    public PagedList ResultsList { get; set; }
}


[HttpPost]
public ActionResult Results(SearchModel model)
{
    model.ResultList = SearchManager.Search(model).ToList();
    return View(model);
}
2 голосов
/ 01 мая 2011

Один из вариантов, которые я здесь придумаю, состоит в том, чтобы реализовать систему распределенного кэширования, которая поддерживает работу в качестве пользовательского поставщика сеансов (например, Memcached или Windows Server AppFabric), что позволяет мне использовать TempData (и Session) всреда с балансировкой нагрузки примерно такая:

[HttpPost]
public ActionResult Results(SearchModel model)
{
    ResultsModel results = new ResultsModel();
    results.ResultList = SearchManager.Search(model).ToList();

    TempData["SearchModel"] = model;

    return View("Results", results);
}

    [HttpGet]
    public ActionResult Results(int? page)
    {
        SearchModel model = (SearchModel)TempData["SearchModel"];

        ResultsModel results = new ResultsModel();
        results.ResultList = SearchManager.Search(model).ToList();

        TempData["SearchModel"] = model;

        return View("Results", results);
    }

Есть мысли по поводу этого подхода?Похоже, многое нужно пройти, чтобы получить параметры поиска, передаваемые между запросами.Или, может быть, я был просто избалован всем этим за кулисами с WebForms.:)

0 голосов
/ 02 мая 2011

Это, кажется, еще один интересный вариант для испорченного Webforms парня;) Сохранение состояния модели в ASP.NET MVC с использованием Serialize HTMLHelper Какое-то воплощение ViewState. Это часть MVC Futures. Не уверен, как долго это происходит в проекте Futures и почему он не может попасть в основную библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...