Maison > développement back-end > C++ > Pourquoi mon TextBox pour affiche-t-il 'latitude2' au lieu de 'latitude' après une redirection dans MVC?

Pourquoi mon TextBox pour affiche-t-il 'latitude2' au lieu de 'latitude' après une redirection dans MVC?

Mary-Kate Olsen
Libérer: 2025-02-01 08:21:10
original
265 Les gens l'ont consulté

Why Does My TextBoxFor Display

MVC TextBoxFor: Initial vs Valeurs mises à jour

Cet exemple démontre un problème commun dans les applications ASP.NET MVC où TextBoxFor affiche une valeur initiale inattendue au lieu de la valeur mise à jour.

Examinons un scénario d'action et de visualisation MVC:

Actions du contrôleur:

<code class="language-csharp">[HttpPost]
public ActionResult SomeInformation()
{
    var test1 = new DataSites { Latitude = "LATITUDE2" };
    return RedirectToAction("Index", test1);
}

[HttpPost]
public ActionResult Index(DataSites dataSiteList)
{
    if (dataSiteList.Latitude != null)
    {
        var test = new DataSites { Latitude = "LATITUDE" };
        return View(test);
    }
    return View(dataSiteList);
}</code>
Copier après la connexion

Voir:

<code class="language-csharp">@model miniproj2.Models.DataSites

<p>
    @Html.TextBoxFor(x => x.Latitude)
</p></code>
Copier après la connexion

Modèle:

<code class="language-csharp">public class DataSites
{
    public string Latitude { get; set; }
}</code>
Copier après la connexion

Le problème: après avoir navigué vers /Home/SomeInformation (définir la latitude sur "latitude2") et rediriger vers Index, la vue affiche "Latitude2" au lieu de la "latitude" attendue.

Explication:

le RedirectToAction avec un modèle passe les données comme valeurs de route. Le liant du modèle par défaut remplit ensuite ModelState avec cette valeur ("latitude2"). Même si l'action Index tente d'attribuer une nouvelle valeur ("latitude"), la valeur ModelState existante a priorité.

Solutions:

Deux approches abordent efficacement ceci:

  1. Effacer ModelState: Effacer le ModelState avant d'attribuer la nouvelle valeur dans l'action Index:
<code class="language-csharp">[HttpPost]
public ActionResult Index(DataSites dataSiteList)
{
    ModelState.Clear(); // Add this line

    if (dataSiteList.Latitude != null)
    {
        var test = new DataSites { Latitude = "LATITUDE" };
        return View(test);
    }
    return View(dataSiteList);
}</code>
Copier après la connexion
  1. Évitez la liaison du modèle: Initialisez une nouvelle instance DataSites directement dans l'action Index, en contournant entièrement la liaison du modèle:
<code class="language-csharp">[HttpPost]
public ActionResult Index(DataSites dataSiteList)
{
    var test = new DataSites { Latitude = "LATITUDE" }; // No reliance on dataSiteList
    return View(test);
}</code>
Copier après la connexion

Le choix entre ces solutions dépend de la question de savoir si vous devez accéder aux données de dataSiteList à d'autres fins dans l'action Index. Sinon, la deuxième solution (éviter la liaison du modèle) est plus propre et plus efficace. Sinon, la compensation ModelState est nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal