如何在ASP.NET C#应用程序中放置可选的文件上传按钮?

时间:2018-11-14 04:49:22

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

我有一个基本的asp.net c#应用程序,该应用程序具有将一些数据提交到数据库的表单,该表单具有用于上传文件的上传按钮。

最初,存在一个问题:我无法在不上传文件的情况下提交表单,这是一个错误,因为[对象引用未设置为对象的实例],这意味着上传文件是提交表单之前必须填写。因此,为解决该问题,我在控制器中进行了一些更改。

现在,即使我没有上传任何东西,它也可以提交表单,但是新的问题是,当我上传文件并提交时,它仍然可以成功提交表单,但没有上传实际文件。

这是模型:

  public class Events
{
    public int Id { get; set; }
    public string title { get; set; }
    public string amount { get; set; }
    public string Finance_Approval { get; set; }
    public DateTime date_time { get; set; }

    public string file_one { get; set; }
    [NotMapped]
    public HttpPostedFileBase file1 { get; set; }
}

这是控制器:

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


   public ActionResult Request(Events e)
    {
        if (e.file_one==null)
        {
            _context.evt.Add(e);
            _context.SaveChanges();

            return Content("Added");
        }

        else
        {
            string filename = Path.GetFileNameWithoutExtension(e.file1.FileName);
            string extension = Path.GetExtension(e.file1.FileName);
            filename = filename + DateTime.Now.ToString("yymmssfff") + extension;
            e.file_one = "PM_Files/" + filename;
            filename = Path.Combine(Server.MapPath("~/PM_Files/"), filename);
            e.file1.SaveAs(filename);

            _context.evt.Add(e);
            _context.SaveChanges();

            return Content("Added");
        }

    }

这是剃刀视图:

@using (Html.BeginForm("Request", "Requester", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div class="form-group">
        @Html.LabelFor(a => a.title)
        @Html.TextBoxFor(a => a.title, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(a => a.amount)
        @Html.TextBoxFor(a => a.amount, new { @class = "form-control" })
    </div>
    <div class="form-group">
        <label>Select the file word or pdf etc</label>
        <input type="file" name="file1" />
    </div>    
    <button class="btn btn-primary">Request</button>
}

1 个答案:

答案 0 :(得分:1)

确切的问题是,您正在针对HttpPostedFileBase字符串属性检查null,该字符串属性始终为null值,因为视图页面内没有与之关联的表单控件。您应改为检查[HttpPost] public ActionResult Request(Events e) { if (e.file1 != null && e.file1.ContentLength > 0) { // save the file return Content("Added"); } else { // do something else return Content("Added"); } }

HttpPostedFileBase

如果上面的标准Request.Files检查不起作用,则应尝试[HttpPost] public ActionResult Request(Events e) { if (Request.Files.Count > 0) { foreach (string files in Request.Files) { if (!string.IsNullOrEmpty(files)) { // save the file } } return Content("Added"); } else { // do something else return Content("Added"); } } 来获取文件信息:

FormMethod.Post

注释:

1)表单使用[HttpPost],因此控制器操作应使用{{1}}属性。

2)[NotMapped] attribute仅用于数据模型,以排除实体到数据库中列的映射-在视图模型中不使用,只需将其删除。