2010-10-02 19 views
0

Je suis nouveau sur asp.net mvc, mais j'ai fait des recherches approfondies sur ce sujet partout.ViewModel ne lie pas du formulaire POST lorsqu'il est passé dans une méthode en tant que paramètre

J'ai une classe ViewModel nommée PictureViewModel qui est la classe d'une vue EditorTemplate hérite de: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl" %>

<div class="editor-label"><%: Html.LabelFor(m=>m.Name) %></div> 
<div class="editor-field"><%: Html.TextBox("form.Name") %></div> 

<div class="editor-label"><%: Html.LabelFor(m=>m.Description) %></div> 
<div class="editor-field"><%: Html.TextArea("form.Description") %></div> 

<% Html.RenderAction("SelectCategory", "Category"); %> 

<div class="editor-label"><label for="thumbFile">Thumb</label></div> 
<div class="editor-field"><input id="thumbFile" name="thumbFile" type="file"/></div> 

<div class="editor-label"><label for="fullFile">Full</label></div> 
<div class="editor-field"><input id="fullFile" name="fullFile" type="file"/></div> 

J'ai aussi des champs de fichiers et tout ce qui est affiché à se

<%@ Page Title="" Language="C#" MasterPageFile="/Views/Shared/Site_Table.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcApplicationVelarPolya.Areas.Admin.Models.PictureViewModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Create 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Create</h2> 

    <% 
    using (Html.BeginForm("create", "Pictures", FormMethod.Post, new {enctype="multipart/form-data"})) 
    {%> 

    <%: Html.EditorForModel() %> 

    <input type="submit" name="Create" /> 

<% }%> 

</asp:Content> 

et voici le code consacré à gérer le soumettre:

[HttpPost] 
    public ActionResult Create([Bind(Prefix="form")] PictureViewModel pm) 
    { 
     try 
     { 
      var p = new PictureViewModel(); 
      UpdateModel(p, "",new[] {"Name", "Description"}); 
      ViewData["name"] = Request.Files[0].FileName; 
      return View("New", p); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

L'ajout de préfixes, ni l'utilisation de FormCollection avec UpdateModel n'aident pas. J'apprécierais grandement toute aide! Andrew.

Oh, oui, viewdata est correctement renseigné avec le nom de fichier!

Cela ne fonctionne pas, trop [HttpPost] public ActionResult Créer (FormCollection fc/[Bind (préfixe = "form")] PictureViewModel pm /) { essayer { var p = new PictureViewModel() UpdateModel (p, "form", new [] {"Nom", "Description"}); ViewData ["name"] = Request.Files [0] .FileName; // TODO: Ajouter la logique d'insertion ici return View ("New", p); return RedirectToAction ("Index"); } catch { return(); } }

Et ce code

 foreach (var k in fc) 
     { 
      Debug.WriteLine(k.ToString()); 
     } 

est la production

form.Name 
form.Description 
CategoryID 
Create 
+0

ajoutez votre FormCollection et regardez les clés que vous recevez. dedans. – Stefanvds

+0

J'ai essayé, 4 clés existent. – berezovskyi

Répondre

1

Dans votre modèle de l'éditeur, vous devez utiliser des aides fortement typés (TextBoxFor et TextAreaFor) et vous pouvez vous débarrasser des cordes magiques et les préfixes:

<div class="editor-label"><%: Html.LabelFor(m => m.Name) %></div> 
<div class="editor-field"><%: Html.TextBoxFor(m => m.Name) %></div> 

<div class="editor-label"><%: Html.LabelFor(m => m.Description) %></div> 
<div class="editor-field"><%: Html.TextAreaFor(m => m.Description) %></div> 

<% Html.RenderAction("SelectCategory", "Category"); %> 

<div class="editor-label"><label for="thumbFile">Thumb</label></div> 
<div class="editor-field"><input id="thumbFile" name="thumbFile" type="file"/></div> 

<div class="editor-label"><label for="fullFile">Full</label></div> 
<div class="editor-field"><input id="fullFile" name="fullFile" type="file"/></div> 

Pour gérer les fichiers téléchargés, vous pouvez les ajouter soit en tant que propriétés du modèle de vue ou en tant que paramètres d'action:

public class PictureViewModel 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public HttpPostedFileBase ThumbFile { get; set; } 
    public HttpPostedFileBase FullFile { get; set; } 
} 

... 

[HttpPost] 
public ActionResult Create(PictureViewModel pm) 
{ 
    // Normally the pm variable should be fully 
    // initialized here from the POST request and you can use it directly 
    // No need to call UpdateModel 
    return View("New", pm); 
}