2010-06-23 5 views
2

Je viens de commencer à apprendre MVC et j'essaie de comprendre comment cela fonctionne.MVC transférer des données entre les vues

Je ne souhaite pas envoyer des utilisateurs à des vues différentes pour toutes les opérations d'édition, d'insertion et de liste.

Dans mon exemple d'application, une vue contient une liste d'éléments et sous la liste un formulaire (pour insérer de nouveaux éléments) avec l'action "{Contrôleur}/Créer" mais aucune vue Créer.

Lorsqu'un utilisateur insère un nouvel élément, il le publie dans l'action Créer avec la fonction httpverb et crée l'élément, puis revient à l'action Lister avec la méthode RedirectToAction.

Mais je ne peux afficher aucun message (erreur, information, etc.) à l'utilisateur dans ce style car je ne peux pas transmettre de données entre l'action Créer et l'action Lister. Comment puis je faire ça?

Répondre

0

La plupart des frameworks MVC ont la capacité de stocker temporairement un petit bit de données juste à travers la requête suivante, juste pour cela. Dans ASP.NET MVC son appelé TempData, dans Rails il est appelé: flash, etc.

+0

Tempdata n'est pas la meilleure option et devrait l'éviter. référez-vous à ce qui suit pourquoi la tempdata n'est pas bonne: http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/ –

+0

In l'exemple décrit dans le post que vous mentionnez, TempData est toujours utilisé, il est juste emballé de sorte qu'il n'est pas référencé explicitement. Même dans cette approche, TempData est le mécanisme correct pour transmettre ce type de données; la différence est juste dans la façon dont vous utilisez TempData. –

0

This article explique comment utiliser TempData:

L'une des choses plus ennuyeuses à accord avec la programmation Web est erreurs sur un formulaire. Plus précisément, vous voulez pour afficher les messages d'erreur, mais souhaitez conserver les données précédemment entrées. Nous avons tous eu l'expérience de faire une erreur sur un formulaire qui a 35 champs , seulement pour être présenté avec un tas de messages d'erreur et un nouveau formulaire vide, . MVC Framework offre TempData comme un emplacement pour stocker les informations précédemment saisies afin que le formulaire puisse être repeuplé. Ceci est quelque chose que ViewState réellement fait très facile dans les formulaires Web, depuis la sauvegarde le contenu des contrôles était assez beaucoup automatique. ... TempData est un dictionnaire, un peu comme le ViewData non typé. Toutefois, le contenu de TempData seulement en direct pour une seule demande, puis ils sont supprimés.

4

Vous devez utiliser la redirection de poste Obtenir un modèle PRG.

S'il vous plaît lire ce Utilisez PRG Motif de la section Modification des données dans ce blog par Kazi Manzur Rashid.
http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx


Cette approche utilise TempData pour maintenir ModelState données entre réoriente.

[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"); 
} 


Et voici votre méthode d'action Index.

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


Et voici votre vue 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. Les ImportModelStateFromTempData et ExportModelStateToTempData attributs aide modèle de transfert erreurs d'état entre réoriente. Ce
  2. <% ViewContext.FormContext.ValidationSummaryId = "valSumCreateForm"; %> associe le formulaire MVC avec son résumé de validation correspondant.



Vous pouvez vérifier une autre réponse par moi sur ce ici. ViewModel with SelectList binding in ASP.NET MVC2


Laissez-moi savoir si vous avez des questions.
-Soe

Questions connexes