You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET MVC中实现HttpPostedFile类型附件可选上传?

报错根因

未上传附件时,控制器接收的HttpPostedFileBase类型的PostedFile参数会直接为null。你之前的所有校验逻辑都没有先判断参数本身是否为空,直接访问FileName、ContentLength属性,就会触发「Object reference not set to an instance of an object」空引用报错,这也是你之前尝试校验ContentLength依然报错的原因。

修复方案
  1. 首先明确规则:HttpPostedFileBase是引用类型,本身就允许为null,不需要额外加?可空修饰符,你之前加?不生效是混淆了值类型和引用类型的可空语法。
  2. 调整文件校验逻辑,先判断PostedFile本身是否为null,再访问其内部属性即可。

修正后的控制器代码如下:

[HttpPost]
public ActionResult AssetDisposal(AssetDisposalViewModel model, HttpPostedFileBase PostedFile)
{
    if (!ModelState.IsValid)
    {
        genericService.LoadAssetDisposalTypes(model);
        genericService.LoadAssetDisposalMethods(model);
        genericService.LoadAssetDisposalBusinessUnits(model);
        genericService.LoadAssetDisposalUsers(model);
        genericService.LoadAssetDisposalOffices(model);
        return View(model);
    }                

    if (ModelState.IsValid)
    {
        var ast = new AssetDisposal();
        model.UpdateModel(ast);               
        genericService.AddAssetDisposal(server);
      
        // 先判断参数本身不为空,再校验文件内容
        if (PostedFile != null && PostedFile.ContentLength > 0 && !string.IsNullOrEmpty(PostedFile.FileName))
        {
            // 有上传文件的业务逻辑
            string FileExt = Path.GetExtension(PostedFile.FileName).ToUpper();
            var fileName = String.Format("{1}{2}{0}", Path.GetFileName(PostedFile.FileName), user, DateTime.Now.ToString("yyyyMMddHHmmss_"));
            Session["fileName"] = Path.GetFileName(PostedFile.FileName);
            var path = @"C:\Users\username\Documents\AssetSysAttachments\" + fileName;
            Session["fileUrl"] = path;                 
            PostedFile.SaveAs(path);
        }
        else
        {
            // 无上传文件的业务逻辑
            // some logic here
        }
       
        return RedirectToAction("AssetDisposals");
    }
    return RedirectToAction("AssetDisposals");
}
额外注意事项
  • 视图端表单必须加上enctype="multipart/form-data"属性,否则就算用户上传了文件,后台收到的PostedFile也会是null:
@using (Html.BeginForm("AssetDisposal", "你的控制器名称", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @* 表单其他字段、文件上传控件 *@
}
  • 如果要让模型校验自动忽略文件字段,不要在AssetDisposalViewModel的对应文件属性上加[Required]注解即可。

内容的提问来源于stack exchange,提问作者Golide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:36:03