2010-09-24 1 views
1

Je dois saisir le code suivant dans le contrôleur et la vue. Le problème est que le modèle (Photo est une entité Entity Framework) est vide (tous les champs sont annulés). Pourquoi?Modèle vide lors de la soumission du formulaire asp.net mvc 2

// GET: /Admin/Photo/Create 

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

    // 
    // POST: /Admin/Photo/Create 

    [HttpPost] 
    public ActionResult Create(int id, FormCollection collection) 
    { 
     try 
     { 
      var file = (HttpPostedFileBase) Request.Files[0]; 
      if (file != null && file.FileName != null) 
      { 
       var filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Photos/Product/", Path.GetFileName(file.FileName)); 
       file.SaveAs(filename); 
       var photo = new Photo(); 
       photo.Description = collection["Description"]; 
       photo.Main = collection["Main"].Contains("true"); 
       photo.Filename = Path.GetFileName(file.FileName); 
       photo.Product_Id = id; 
       Entities.AddToPhotos(photo); 
       Entities.SaveChanges(); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Plik musi zostać załadowany."); 
       return View(); 
      } 


      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

<h2>Create</h2> 

<% using (Html.BeginForm(null, null, null, FormMethod.Post, new {enctype = "multipart/form-data" })) {%> 
    <%: Html.ValidationSummary(true) %> 

    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Description) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Description) %> 
      <%: Html.ValidationMessageFor(model => model.Description) %> 
     </div> 

     <div class="editor-label"> 
      <label for="MainContent_file">Plik: </label> 
     </div> 
     <div class="editor-field"> 
      <asp:FileUpload ID="file" runat="server" /> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Main) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.CheckBoxFor(model => model.Main) %> 
      <%: Html.ValidationMessageFor(model => model.Main) %> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 

Mise à jour: J'ai vérifié et la collection est remplie avec les champs appropriés, mais ils sont tous Nulled.

+0

Juste une copie droite et coller avec votre code html et - avec un modèle contenant uniquement Description et principal - il fonctionne très bien. Le problème peut exister en dehors de ce fichier particulier. Vous utilisez un contrôle ASP: FileUpload. Essayez de le remplacer par une entrée. Cependant, vous devrez supprimer la balise

dans la page maître. – Buildstarted

+0

Sans le contrôle FileUpload cela fonctionne très bien. Je n'ai pas besoin d'enlever la balise dans la masterpage - c'est Asp.net MVC, et je n'ai pas dans masterpage. – Agares

+0

Eh bien, la raison pour laquelle j'ai demandé à propos de la balise de formulaire est parce qu'un nouveau projet avec la balise asp: FileUpload génère une erreur qui nécessite la balise form avec runat = server ... donc basé sur le fait qu'une balise de formulaire existe sûrement quelque part. – Buildstarted

Répondre

1

Assurez-vous que les attributs de nom dans le fichier html correspondent à votre nom de collection. Vous pouvez également modifier votre public ActionResult Create(int id, FormCollection collection) en public ActionResult Create(int id, YourViewModel model) pour mapper automagiquement les valeurs de poste au modèle.

+0

Je suis sûr que les noms dans la forme sont les mêmes que dans le modèle. J'ai changé FormCollection en Photo, mais ça n'aide pas. – Agares

+1

Avez-vous défini un point d'arrêt et validé que la collection possède les valeurs appropriées dans le formulaire? – Buildstarted

+0

+1 voir ma réponse, si c'est comme je le décris, le problème ne se serait pas produit avec le mappage automatique. Cela dit, le modèle de l'OP ne semble pas être un modèle de vue, il est donc préférable de ne pas utiliser la liaison automatique avec (je préfère présenter le modèle de vue avec seulement les champs que je voudrais bien). – eglasius

0

Vérifiez la source html dans le navigateur.

Il pourrait être de les envoyer comme: « Photo.Description »

+0

- Je pense que c'est ok. – Agares

+0

@Agares ne m'attendais pas à cela, je suggère de le vérifier avec le débogueur comme BuildStarted suggéré de voir si la collection arrive avec quelque chose du tout. Quant à savoir pourquoi cela se produirait je ne suis pas sûr/poster vos conclusions dans une mise à jour de la question, avec les informations supplémentaires quelqu'un pourrait vous donner la réponse. – eglasius

Questions connexes