ASP.NET MVC Model Binding est encore nouveau pour moi et j'essaie de comprendre exactement comment cela fonctionne. En ce moment, je semble avoir des problèmes avec une fonctionnalité de Html.Textbox()ASP.NET MVC2 - Problème avec la liaison de modèle et Html.Textbox()
Plus précisément, j'ai une vue où j'ai mis Html.Textbox à une valeur à la fois dans le "Get" et le "Post". Il se règle bien dans le "Get", mais après que l'utilisateur soumet une valeur pendant le "Post", j'ai la classe changer une des valeurs en interne en fonction de l'autre valeur soumise.
(je valider essentiellement une valeur basée sur l'autre ... Je ne sais pas si cela est la bonne façon de le faire ...)
Tracing à travers, je peux voir que la valeur a effectivement changé comme prévu dans le modèle et dans la vue, mais quand il s'affiche sur mon écran après le "Post", la valeur ne s'affiche pas comme il a été changé. Au lieu de cela, c'est ce à quoi il était destiné à l'origine.
Voici mon exemple simplifié:
La vue montre un:
- déroulant avec des éléments d'un SelectList (pré-sélectionné comme "Autre")
- une zone de texte en lecture seule (avec une valeur préchargée de 0)
- bouton Envoyer
l'utilisateur doit choisir une nouvelle valeur de la liste déroulante et cliquez sur soumettre. La méthode "Post" dans le contrôleur récupère la nouvelle valeur dans la liste déroulante et modifie la valeur dans la zone de texte en lecture seule et réaffiche.
(Oui, je vais finalement faire cela avec JQuery, aussi ...)
Voici mon exemple modèle classe:
public class SampleSubmission
{
public string Name { get; set; }
public int Volume { get; set; }
public readonly SortedList<string, int> NameVolumeList = new SortedList<string, int>();
// Standard Constructor
public SampleSubmission()
{
NameVolumeList.Add("Sample1", 10);
NameVolumeList.Add("Sample2", 20);
NameVolumeList.Add("Sample3", 50);
NameVolumeList.Add("Other", 0);
this.Name = NameVolumeList.Keys[0];
this.Volume = NameVolumeList[Name];
}
// Copy Constructor
public SampleSubmission(SampleSubmission samSub) : this()
{
this.Name = samSub.Name;
this.Volume = NameVolumeList[Name];
}
}
Voici le contrôleur:
public class SampleSubmissionController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
SampleSubmission sampleSub = new SampleSubmission();
return View(sampleSub);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(SampleSubmission sampleSub)
{
SampleSubmission samSub = new SampleSubmission(sampleSub);
return View(samSub);
}
}
Voici la vue:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<MvcModelBindTest.Models.SampleSubmission>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) { %>
<%= Html.DropDownList("Name", new SelectList(Model.NameVolumeList.Keys.ToList())) %>
<%= Html.TextBox("Volume",Model.Volume) %>
<input type="submit" name="pick" id="pick" value="Pick" /> <% } %>
</asp:Content>
Des idées sur pourquoi la nouvelle valeur ne s'affiche pas?
EDIT:
Pour résoudre le problème, je lis le lien donné par « jfar » et a fait un changement de 1 ligne.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(SampleSubmission sampleSub)
{
SampleSubmission samSub = new SampleSubmission(sampleSub);
// Reset Model Value
ModelState.SetModelValue("Volume", new ValueProviderResult(
samSub.Volume, "", System.Globalization.CultureInfo.CurrentCulture));
return View(samSub);
}
Cela fonctionne définitivement. Malheureusement, cela ressemble à un hack grossier pour moi. Et si je devais mettre à jour les valeurs de plusieurs champs? Il doit y avoir une meilleure (plus simple?) Façon de le faire.
EDIT2: Trouvé ma réponse. Voir ci-dessous...
double possible [Comment effacer les zones de texte définies avec des aides MVC HTML] (http://stackoverflow.com/ questions/3444994/comment-effacer-textboxes-defined-with-mvc-html-helpers) – jfar