ASP.NET mvc3网页不会将文件上传到服务器

时间:2012-04-19 22:32:59

标签: c# asp.net-mvc-3 file-upload

我试图在我的数据库中存储一个类别对象并上传一个我可以参考这个类别的图像,

该类别存储完美,但由于某种原因图像未上传。当我调试时,我可以看到我的应用程序从未进入将文件存储在服务器上的方法,因为我的文件是“空”。

模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace SkyLearn.Areas.Categories.Models
{
    public class Category
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Icon { get; set; }
        public string Description { get; set; }
    }

    public class CategoryDBContext : DbContext
    {
        public DbSet<Category> categories { get; set; }
    }
}

控制器:

//
// POST: /Categories/Category/Create
[Authorize(Roles = "administrator")]
[HttpPost]
public ActionResult Create(Category category, HttpPostedFileBase Icon)
{
    if (Icon != null && Icon.ContentLength > 0)
    {
        // extract only the filename
        var fileName = Path.GetFileName(Icon.FileName);
        // store the file inside ~/App_Data/uploads folder
        var path = Path.Combine(Server.MapPath("../Content/icons/"), fileName);
        Icon.SaveAs(path);
        category.Icon = fileName;
    }

    if (ModelState.IsValid)
    {
        db.categories.Add(category);
        db.SaveChanges();
        return RedirectToAction("Index");  
    }

    return View(category);
}

视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.master" Inherits="System.Web.Mvc.ViewPage<SkyLearn.Areas.Categories.Models.Category>" %>

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

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

<h2>Create</h2>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% using (Html.BeginForm()) { %>
<form action="" method="post" enctype="multipart/form-data">
    <%: Html.ValidationSummary(true) %>
    <fieldset>
        <legend>Category</legend>

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

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Icon) %>
        </div>
        <div class="editor-field">
            <input type="file" name="icon" id="icon"/>
        </div>

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

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

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

</asp:Content>

任何能告诉我它为什么不输入保存文件ID的方法的人都要感激不尽。

我尝试在stackoverflow上查看其他答案,即使其中一些问题和我一样,他们的解决方案并没有解决我的问题。

我也尝试在config.web中更改上传大小等。

请帮帮我:)。

2 个答案:

答案 0 :(得分:1)

我不知道浏览器如何处理嵌套表单,但使用Html.BeginForm()然后手动写出表单标记毫无意义。 Html.BeginForm()重载输出Html属性:

Html.BeginForm(action, controller, 
    FormMethod.Post, new { enctype="multipart/form-data" })

答案 1 :(得分:0)

ModelBinder可能正在爆炸。当您的表单按照原样设置时,您无法为名为Icon的操作方法输入一个名为Category的{​​{1}}类的属性(所有表格值都会匹配Icon属性。)

此外,您的表单字段名称是小写的“图标”,而不是C#中匹配的大写“图标”

您可以创建一个自定义类,操作方法将从表单发布:

Category

然后在动作方法

上设置该参数
public class CategoryWithFile : Category
{
    public HttpPostedFileBase IconFile { get; set; }
}

并将您的表单更改为:

public ActionResult Create(CategoryWithFile category)