Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source
Ce sujet n'a pas encore été évalué - Évaluez ce sujet

Passage de données dans une application ASP.NET MVC

L'infrastructure ASP.NET MVC fournit des conteneurs au niveau de la page qui peuvent passer des données entre les contrôleurs et les vues. Cette rubrique explique comment passer des données faiblement et fortement typées dans une application MVC. Elle indique également comment passer des données d'état temporaires entre des méthodes d'action.

Pour restituer une vue, vous pouvez appeler la méthode View du contrôleur. Pour passer des données à la vue, vous pouvez utiliser la propriété ViewData de la classe ViewPage. Cette propriété retourne un objet ViewDataDictionary comportant des clés de chaîne qui ne respectent pas la casse. Pour passer des données à la vue, vous pouvez assigner des valeurs au dictionnaire, comme indiqué dans l'exemple suivant :


List<string> petList = new List<string>();
petList.Add("Dog");
petList.Add("Cat");
petList.Add("Hamster");
petList.Add("Parrot");
petList.Add("Gold fish");
petList.Add("Mountain lion");
petList.Add("Elephant");

ViewData["Pets"] = new SelectList(petList);


Si vous appelez la méthode View sans paramètres (comme indiqué dans l'exemple précédent), la propriété ViewData de l'objet de contrôleur est passée à la vue qui porte le même nom que la méthode d'action.

Dans la page de vue, vous pouvez accéder à la propriété ViewData pour obtenir les données passées à la vue. La propriété ViewData est un dictionnaire qui prend en charge un indexeur acceptant les clés de dictionnaire.

L'exemple suivant présente le balisage d'une vue affichant les données d'un formulaire HTML et permettant à l'utilisateur de modifier des valeurs et d'effectuer des sélections.


<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<br /><br />
<% using(Html.BeginForm("HandleForm", "Home")) %>
<% { %>
    Enter your name: <%= Html.TextBox("name") %>
    <br /><br />
    Select your favorite color:<br />
    <%= Html.RadioButton("favColor", "Blue", true) %> Blue <br />
    <%= Html.RadioButton("favColor", "Purple", false)%> Purple <br />
    <%= Html.RadioButton("favColor", "Red", false)%> Red <br />
    <%= Html.RadioButton("favColor", "Orange", false)%> Orange <br />
    <%= Html.RadioButton("favColor", "Yellow", false)%> Yellow <br />
    <%= Html.RadioButton("favColor", "Brown", false)%> Brown <br />
    <%= Html.RadioButton("favColor", "Green", false)%> Green 
    <br /><br />
    <%= Html.CheckBox("bookType") %> I read more fiction than non-fiction.<br />
    <br /><br />
    My favorite pet: <%= Html.DropDownList("pets") %>
    <br /><br />
    <input type="submit" value="Submit" />
<% } %>


Lorsque vous passez des données entre une vue et un contrôleur à l'aide de la propriété ViewData de la classe ViewPage, celles-ci ne sont pas fortement typées. Si vous souhaitez passer des données fortement typées, modifiez la déclaration @ Page de la vue afin que cette dernière hérite de ViewPage<TModel> au lieu de ViewPage, comme indiqué dans l'exemple suivant :

<%@ Page Inherits="ViewPage<Product>" %>

ViewPage<TModel> est la version fortement typée de ViewPage. La propriété ViewData de ViewPage<TModel> retourne un objet ViewDataDictionary<TModel> qui inclut des données fortement typées pour la vue en fonction d'un modèle. Le modèle est une classe contenant des propriétés pour chaque élément de données que vous souhaitez passer. (Une approche plus simple de la création d'une page de vue fortement typée consiste à utiliser la boîte de dialogue Ajouter une vue.)

L'exemple suivant présente la définition d'une classe de modèle de données standard nommée Person.


public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}


L'exemple suivant présente une vue permettant à l'utilisateur de modifier les valeurs d'un objet Person et d'envoyer les modifications en vue d'une mise à jour.


<h2>Edit</h2>

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Id">Id:</label>
            <%= Html.TextBox("Id", Model.Id) %>
            <%= Html.ValidationMessage("Id", "*") %>
        </p>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name", Model.Name) %>
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <label for="Age">Age:</label>
            <%= Html.TextBox("Age", Model.Age) %>
            <%= Html.ValidationMessage("Age", "*") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

<div>
    <%=Html.ActionLink("Back to List", "Index") %>
</div>


L'exemple suivant présente la méthode d'action qui reçoit un objet Person provenant de la vue Edit (Édition), vérifie sa validité par rapport au modèle, met à jour une liste d'objets Person, puis effectue une redirection vers l'action Index.


[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Person p)
{
    if (!ModelState.IsValid)
    {
        return View("Edit", p);
    }

    foreach (Person pn in people)
    {
        if (pn.Id == p.Id)
        {
            pn.Name = p.Name;
            pn.Age = p.Age;
            pn.Id = p.Id;
        }
    }

    return RedirectToAction("Index");
}


Pour plus d'informations et des liens vers les exemples téléchargeables de vues fortement typées, consultez Comment : valider des données de modèle à l'aide d'attributs DataAnnotationset Procédure pas à pas : utilisation de programmes d'assistance basés sur un modèle pour afficher des données dans ASP.NET MVC.

Les méthodes d'action devront peut-être passer des données à une autre action, par exemple si une erreur se produit lorsqu'un formulaire est publié, ou si la méthode doit rediriger l'utilisateur vers des méthodes supplémentaires, par exemple lorsque l'utilisateur est dirigé vers une vue d'ouverture de session puis renvoyé vers la méthode d'action d'origine.

Une méthode d'action peut stocker des données dans l'objet TempDataDictionary du contrôleur avant d'appeler la méthode RedirectToAction du contrôleur pour invoquer l'action suivante. La valeur de la propriété TempData est stockée dans l'état de session. Toute méthode d'action appelée après la définition de la valeur TempDataDictionary peut obtenir des valeurs de l'objet, puis les traiter ou les afficher. La valeur de TempData est conservée jusqu'à ce qu'elle soit lue ou jusqu'à ce que la session expire. Cette conservation de TempData permet des scénarios tels que la redirection, car les valeurs de TempData sont disponibles au-delà d'une seule demande.

Remarque Remarque :

Ce comportement est nouveau dans ASP.NET MVC 2. Dans les versions antérieures d'ASP.NET MVC, les valeurs de TempData étaient uniquement disponibles jusqu'à la demande suivante.

L'exemple suivant présente une classe de données utilisée pour intercepter une erreur et transférer des données entre des actions.

public class InsertError
{
    public string ErrorMessage { get; set; }
    public string OriginalFirstName { get; set; }
    public string OriginalLastName { get; set; }
}

// CustomersController

public ActionResult InsertCustomer(string firstName, string lastName)
{
    // Check for input errors.
    if (String.IsNullOrEmpty(firstName) ||
            String.IsNullOrEmpty(lastName))
    {
        InsertError error = new InsertError();
        error.ErrorMessage = "Both names are required.";
        error.OriginalFirstName = firstName;
        error.OriginalLastName = lastName;
        TempData["error"] = error;
        return RedirectToAction("NewCustomer");
    }
    // No errors
    // ...
    return View();
}

public ActionResult NewCustomer()
{
    InsertError err = TempData["error"] as InsertError;
    if (err != null)
    {
        // If there is error data from the previous action, display it.
        ViewData["FirstName"] = err.OriginalFirstName;
        ViewData["LastName"] = err.OriginalLastName;
        ViewData["ErrorMessage"] = err.ErrorMessage;
    }
    // ...
    return View();
}

L'exemple suivant affiche le balisage pour une vue qui accepte la saisie utilisateur et affiche un message d'erreur si une erreur se produit.

<form action="/Home/InsertCustomer">
  <% if (ViewData["ErrorMessage"] != null) { %>
    The following error occurred while inserting the customer data:
    <br />
    <%= ViewData["ErrorMessage"] %>
    <br />
  <% } %>

  First name: 
  <input type="text" name="firstName" value="<%= ViewData["FirstName"] %>" />
  <br />
  Last name: 
  <input type="text" name="lastName" value="<%= ViewData["LastName"] %>" />
  <br />    
  <input type="submit" value="Insert" />
</form>
Cela vous a-t-il été utile ?
(1500 caractères restants)
Contenu de la communauté Ajouter
Annotations FAQ