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>
Voir:
<code class="language-csharp">@model miniproj2.Models.DataSites <p> @Html.TextBoxFor(x => x.Latitude) </p></code>
Modèle:
<code class="language-csharp">public class DataSites { public string Latitude { get; set; } }</code>
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:
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>
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>
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!