2009-09-01 9 views
1

Dans mon contrôleur dans une application Asp.net MVC 1, je veux utiliser UpdateModel pour remplir une variable avec des données POST dans mon contrôleur. J'ai regardé des dizaines d'exemples mais même les plus basiques semblent échouer silencieusement pour moi.Problème de base avec Asp.net MVC UpdateModel (myClass)

Voici un exemple très basique qui ne fonctionne tout simplement pas. Qu'est-ce que je fais de mal?

public class TestInfo 
    { 
     public string username; 
     public string email; 
    } 

    public class AdminController : Controller 
    { 

     public ActionResult TestSubmit() 
     { 
      var test = new TestInfo(); 
      UpdateModel(test);//all the properties are still null after this executes 
      //TryUpdateModel(test); //this returns true but fields/properties all null 
      return Json(test); 
     } 


    } 


//Form Code that generates the POST data 
    <form action="/Admin/TestSubmit" method="post"> 
     <div> 
      <fieldset> 
       <legend>Account Information</legend> 
       <p> 
        <label for="username">Username:</label> 
        <input id="username" name="username" type="text" value="" /> 
       </p> 
       <p> 
        <label for="email">Email:</label> 
        <input id="email" name="email" type="text" value="" /> 
       </p> 
       <p> 
        <input type="submit" value="Login" /> 
       </p> 

      </fieldset> 
     </div> 
    </form> 
+0

Merci pour les réponses rapides les gars. J'aime revenir de déjeuner et voir 4 réponses. Je les teste maintenant. Note de côté rapide. Je me base sur l'exemple ci-dessus à la page 374 de Pro Asp.net MVC Framework par Steve Sanderson, et il n'utilise pas l'en-tête [AcceptVerbs (HttpVerbs.Post)] ou un paramètre typé. Le livre est-il incorrect? – Glenn

+0

Compris. Le livre est correct. Il néglige simplement de mentionner que dans ce cas, les méthodes de réflexion utilisées par UpdateModel ne fonctionnent que pour les propriétés même si elles fonctionnent pour des champs qu'il ne possède pas actuellement. On dirait un bug MVC pour moi. Les propriétés sont généralement meilleures, mais pour un modèle de vue simple, il est plus facile de définir les valeurs par défaut des champs au lieu de retaper toutes les valeurs de propriété et de définir les valeurs par défaut dans le constructeur de classe. – Glenn

Répondre

2

propriétés font de votre champ public:

public class TestInfo 
    { 
     public string username {get;set;} 
     public string email{get;set;} 
    } 
+0

UpdateModel repose sur des propriétés, et non des champs, iirc. –

+0

Ahh raté ça. meilleure pratique quand même je suppose – Glenn

+0

Bizarre que cela ne fonctionne pas pour les champs. Je suppose que c'est ma punition de ne pas faire le codage supplémentaire requis pour définir les propriétés par défaut dans le constructeur :-) – Glenn

3

Il semble que vous essayez d'obtenir que le contrôleur mette à jour le modèle en fonction des éléments de formulaire. Essayez ceci:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult TestSubmit(TestInfo test) 
    { 
     UpdateModel(test); 
     return Json(test); 
    } 

Dans votre code, vous créez une nouvelle TestModel au lieu de laisser le moteur d'exécution MVC sérialiser depuis le HttpPost. Je me suis laissé emballer autour de l'axe sur ça aussi, tu n'es pas le seul!

+0

Il s'agit d'une bonne pratique, mais l'utilisation de champs au lieu de propriétés a provoqué l'échec de mes affectations en mode silencieux. – Glenn

0

Je suis pas trop familier avec ASP.NET MVC, mais ne devrait pas votre méthode de TestSubmit regarder plus comme ceci:

public ActionResult TestSubmit(TestInfo test) 
{ 
    UpdateModel(test); 
    return Json(test); 
} 
-1

En le contrôleur vous devriez avoir deux méthodes, une pour répondre à l'EEG, l'autre, si nécessaire, pour répondre au POST.

Ainsi, ont d'abord une méthode GET:

public ActionResult Test() 
{ 
    return View (/* add a TestInfo instance here if you're getting it from somewhere - db etc */); 
} 

Deuxièmement, vous aurez besoin d'une méthode POST:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Test (TestInfo test) 
{ 
    return Json (test); 
} 

avis qu'il n'y a pas là UpdateMethod, le ModelBinder aurait fait pour toi.

+0

Ce sont de bonnes pratiques, mais mon problème était l'utilisation de champs. J'ai testé votre suggestion et c'est une manière claire de diviser les requêtes get et post – Glenn

Questions connexes