MVC HttpPostedFileBase始终为null

时间:2014-02-24 20:47:01

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我有这个控制器,我想做的是将图像作为[字节]发送到控制器,这是我的控制器:

[HttpPost]
public ActionResult AddEquipment(Product product, HttpPostedFileBase image) 
 {

            if (image != null) 
            {
                product.ImageMimeType = image.ContentType;
                product.ImageData = new byte[image.ContentLength];
                image.InputStream.Read(product.ImageData, 0, image.ContentLength);
            }

            _db.Products.Add(product);
            _db.SaveChanges();

            return View();
 }

并且在我看来:

@using (Html.BeginForm("AddEquipment", "Equipment", FormMethod.Post)) {

    <fieldset>
        <legend>Product</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </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>

        <div class="editor-label">
            @Html.LabelFor(model => model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Price)
            @Html.ValidationMessageFor(model => model.Price)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Category)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Category)
            @Html.ValidationMessageFor(model => model.Category)
        </div>

        <div>
        <div>IMAGE</div>
        <input type="file" name="image" />

        </div>


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

但问题是在我的控制器上,图像的值总是为空,我似乎无法获得有关HttpPostedFileBase的任何信息

2 个答案:

答案 0 :(得分:26)

您需要使用multipart / form-data添加encType

@using (Html.BeginForm("AddEquipment", "Equipment", FormMethod.Post, new {enctype = "multipart/form-data" })) {

如果是ViewModel:

,您也可以按照以下方式将其添加到模型中
public class Product 
{
    public Product()
    {
        Files = new List<HttpPostedFileBase>();
    }

    public List<HttpPostedFileBase> Files { get; set; }
    // Rest of model details
}

您可以通过删除不需要的参数来检索文件,例如

[HttpPost]
public ActionResult AddEquipment(Product product) 
 {
    var file = model.Files[0];
    ...
 }

答案 1 :(得分:0)

尝试在Action方法的顶部执行此操作:

[HttpPost]
    public ActionResult AddEquipment(Product product, HttpPostedFileBase image)
    {
        image = image ?? Request.Files["image"];
        // the rest of your code
    }

表单应该有“multipart / form-data”的上传类型来上传文件:

@using (Html.BeginForm("AddEquipment", "Equipment", FormMethod.Post, new {enctype = "multipart/form-data" })) {