2010-09-24 56 views
1

我在控制器和视图中获得以下代码。问题是模型(Photo是一个实体框架实体)是空的(所有字段都是空的)。为什么?提交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> 

更新:我检查和收集填充了适当的领域,但它们都清零。

+0

只是一个单纯的拷贝,并与您的代码和HTML粘贴 - 用只包含描述及主要的模型 - 它工作得很好。该问题可能存在于此特定文件之外。您正在使用asp:FileUpload控件。尝试用输入替换它。但是,您必须删除主页面中的

标签。 – Buildstarted 2010-09-24 17:23:19

+0

没有FileUpload控件,它工作得很好。我不必删除masterpage中的标签 - 它是Asp.net MVC,我在主页面中没有。 – Agares 2010-09-24 17:35:22

+0

嗯,我问的表单标签的原因是因为一个新的项目与asp:FileUpload标签抛出一个错误,它需要与runat =服务器的表单标签...所以基于该表单标签肯定存在,在某处。 – Buildstarted 2010-09-24 19:26:14

回答

1

检查以确保生成的html中的名称属性与您的集合名称匹配。您也可以将public ActionResult Create(int id, FormCollection collection)更改为public ActionResult Create(int id, YourViewModel model),以自动将帖子值映射到模型。

+0

我确信表单中的名称与模型中的名称相同。我已将FormCollection更改为Photo,但它无济于事。 – Agares 2010-09-24 15:30:22

+1

您是否设置了断点并验证集合是否具有表单文章中的相应值? – Buildstarted 2010-09-24 15:48:46

+0

+1请参阅我的答案,如果正如我所描述的那样,自动映射不会发生此问题。也就是说,OP的模型似乎不是视图模型,所以最好不要使用自动绑定(我倾向于将视图模型引入到我想要的字段中)。 – eglasius 2010-09-24 15:54:28

0

检查浏览器中的html源代码。

这可能给他们为:“辛普森”

+0

- 我认为没关系。 – Agares 2010-09-24 16:31:17

+0

@Agares没有想到,我建议用调试器检查它作为BuildStarted建议,以查看该集合是否正在填充任何内容。至于为什么会发生这种情况,我不确定/在问题的更新中发布你的发现,有人可能会给你答案的额外信息。 – eglasius 2010-09-24 16:36:16