MVC Передача данных между представлениями - PullRequest
2 голосов
/ 23 июня 2010

Я только начал изучать MVC и пытаюсь понять, как он работает.

Я не хочу отправлять пользователей в разные представления для всех операций редактирования, вставки и вывода списка.

В моем примере приложения View содержит список элементов, а под списком есть форма (для вставки новых элементов) с действием «{Controller} / Create», но нет представления «Создать».

Когда пользовательвставляет новый элемент, который он отправляет в действие Create с помощью httpverb post, и создает элемент и возвращается к действию List с методом RedirectToAction.

Но я не могу показать пользователю никакого сообщения (ошибка, информация и т. д.)в этом стиле, потому что я не могу передать данные между действием «Создать» и «Список».Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 23 июня 2010

Вам нужно использовать шаблон Post Redirect Get PRG.

Пожалуйста, прочтите этот Используйте шаблон PRG для модификации данных раздел в этом сообщении в блоге Kazi Manzur Rashid http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx

Этот подход использует TempData для поддержки ModelState данных между перенаправлениями.

[HttpPost, ValidateAntiForgeryToken, ExportModelStateToTempData]
public ActionResult Create(FormCollection form)
{
    Product p = new Product();

    if (TryUpdateModel<IProductModel>(p))
    {
        productRepository.CreateProduct( p );
    }
    else
    {
        // add additional validation messages as needed
        ModelState.AddModelError("_generic", "Error Msg");
    }

    return RedirectToAction("Index");
}

И вот ваш Index метод действия.

[ImportModelStateFromTempData]
public ActionResult Index()
{
    IList<Product> products = productRepository.GetAll();
    return View("Index", products);
}

А вот ваше представление Index.

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IList<Product>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Products</h2>

    <% foreach (var p in Model) { %>
        <div><%= Html.Encode( p.ProductName ) %></div>
    <% } %>

    <%= Html.ValidationSummary("Please correct the errors", new { id = "valSumCreateForm" }) %>
    <% using (Html.BeginForm("Create", "Product")) { %>
        Product Name: <%= Html.TextBox("ProductName") %>
        <%= Html.AntiForgeryToken() %>
        <% ViewContext.FormContext.ValidationSummaryId = "valSumCreateForm"; %>
    <% } %>
</asp:Content>
  1. Атрибуты ImportModelStateFromTempData и ExportModelStateToTempData помогают передавать ошибки состояния модели между перенаправлениями.Это
  2. <% ViewContext.FormContext.ValidationSummaryId = "valSumCreateForm"; %> связывает форму MVC с соответствующей Сводной информацией о валидации.

Вы можете проверить другой ответ от меня здесь. ViewModel с привязкой SelectList в ASP.NET MVC2

Дайте мне знать, если у вас есть какие-либо вопросы.-Soe

0 голосов
/ 23 июня 2010

В этой статье объясняется, как использовать TempData :

Одна из самых неприятных вещей, с которыми приходится сталкиваться в веб-программировании, - это ошибки в форме.В частности, вы хотите отобразить сообщения об ошибках, но вы хотите сохранить ранее введенные данные.У всех нас был опыт совершения ошибки в форме, содержащей 35 полей, только для того, чтобы быть представленными с кучей сообщений об ошибках и новой пустой формой. MVC Framework предлагает TempData в качестве места для хранения ранее введенной информации, чтобы можно было повторно заполнить форму. Это то, что ViewState на самом деле очень облегчило в веб-формах, поскольку сохранение содержимого элементов управления было в значительной степениавтоматический.... TempData - это словарь, очень похожий на нетипизированный ViewData.Однако содержимое TempData действует только для одного запроса и затем удаляется.

0 голосов
/ 23 июня 2010

В большинстве сред MVC есть возможность временно хранить небольшой объем данных только в следующем запросе именно для этой цели. В ASP.NET MVC он называется TempData, в Rails он называется: flash и т. Д.

...