2010-06-23 2 views
2

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

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

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

Когда пользователь вставляет новый элемент, он отправляется в действие Создать с сообщением HTTPverb и создает элемент и возвращается к действию «Список» с помощью метода RedirectToAction.

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

ответ

0

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

+0

Tempdata - не самый лучший вариант, и его следует избегать. обратитесь к следующему, почему tempdata не подходит: http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/ –

+0

В пример, описанный в сообщении, которое вы упоминаете, TempData все еще используется, он просто завернут, чтобы он не ссылался явно. Даже в этом подходе TempData является правильным механизмом для передачи этого типа данных; разница заключается только в том, как вы используете TempData. –

0

This article объясняет, как использовать TempData:

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

4

Необходимо использовать пост-перенаправление Получить шаблон PRG.

Пожалуйста, прочтите этот Используйте PRG шаблон для модификации данных раздела в этом блоге по Кази Manzur Рашид.
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 with SelectList binding in ASP.NET MVC2


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

Смежные вопросы