2010-05-27 4 views
1

J'ai une zone de texte dans ma vue. Je saisis un nombre dans la zone de texte, puis je veux que le contrôleur multiplie le nombre et place le résultat dans la zone de texte.Comment mettre à jour la valeur de la zone de texte

Comment puis-je faire cela?

C'est ce que j'ai déjà fait. Commençons par la vue:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 

     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

     <html xmlns="http://www.w3.org/1999/xhtml" > 
      <head runat="server"> 
       <title>Index</title> 
      </head> 
      <body> 
       <div> 
        <h2>Please enter a number</h2> 

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

         <%=Html.TextBox("number")%> 

         <input type="submit" value="Index" name ="Index" /> 

        <% } %> 
       </div> 
      </body> 
     </html> 

Comme vous pouvez le voir, j'ai une zone de texte simple et bouton.

Ceci est mon contrôleur:

using System.Web.Mvc; 

namespace MvcApplication1.Controllers 
{ 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Index(int number) 
     { 
      number = number * 2; 
      ViewData["number"] = number; 
      return View(ViewData); 
     } 
    } 
} 

Mais rien ne se passe vraiment. Oui, je vois le poste est en cours, et les étapes codées dans public ActionResult Index(int number). Je vois que le nombre est pris dans la zone de texte, il est multiplié correctement.

J'ai essayé d'utiliser ViewData comme vous pouvez le voir. J'ai également utilisé TempData. Ceci est un autre code pour la zone de texte dans la vue, je l'ai essayé:

<%=Html.TextBox("number", ViewData["number"])%> 

Mais il n'a pas d'importance. La zone de texte n'est pas mise à jour avec la nouvelle valeur. Comment puis je faire ça?

Répondre

4

Essayez

[HttpPost] 
    public ActionResult Index(int number) 
    { 
     number = number * 2; 
     ViewData["id"] = number; 
     ModelState.Clear(); // this is the key, you could also just clear ModelState for the id field 
     return View(ViewData); 
    } 

Vous pouvez aussi utiliser une entrée html régulière au lieu du HtmlHelper et votre code fonctionnerait comme prévu.

Le comportement par défaut de l'assistant Html vous mord. Il recherche des données dans la collection ModelState avant d'utiliser ce qui est dans ViewData. Le raisonnement est le cas normal est un POST> Validation Fail> Return View, montrant ainsi les données que l'utilisateur a entré est le comportement prévu.

+0

ok merci pour la réponse! – Thomas

Questions connexes