【问题标题】:MVC: How to know which input value from HttpPostedFileBaseMVC:如何知道来自 HttpPostedFileBase 的输入值
【发布时间】:2012-11-02 13:11:47
【问题描述】:

让我先尽可能简单地解释一下我的情况:

假设我有一个包含多个 [input type='File'] 的页面。其中一些可能会被选中,而另一些则不会。

在我的 httppost 方法中,我知道我需要使用像“IEnumerable files”这样的参数来获取文件名,而且我应该定义每个 [input] 名称 = 'files' 或 'files[0]','files[ 1]'等.....

我的问题是:在获取 HttpPostedFileBase 列表时,如何确定哪个文件属于哪个输入控件?因为有些输入可能会留空。

另外因为这些 [input] 是动态创建的,并且没有固定数量,我无法在 httppost 方法中为每个参数硬编码。

【问题讨论】:

  • 如果它们是动态的,为什么你想知道哪个属于什么?
  • 如果用户没有选择文件,您也可以看到编号。集合中的项目数等于编号。文件上传控件,因此您可以使用索引方法。
  • 马克,我的表单有一个对象列表作为模型。这个 只是 1 个属性。所以有些对象可能有这个属性空白(用户没有选择文件)。从 testCoder 的“Request.Files.AllKeys[]”解决方案中,我可以将这些输入的名称设置为“file_ObjectId”。然后我可以比较知道哪个对象没有被选中一个文件。

标签: asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

试试这个解决方案:

查看:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="file1" />
    <input type="file" name="file2"/>
    <input type="file" name="file3"/>
    <input type="file" name="file4"/>
    <input type="file" name="file5"/>

    <input type="submit" value="go" />
}

控制器:

  var uploaded = Request.Files.AllKeys
      .Select(x => new {file = Request.Files[x], name = x})
            .Where(x => x.file.ContentLength > 0).ToList();

“上传的”匿名类型将包含属于输入控件名称的文件,并且仅包含选择的输入名称

【讨论】:

  • 您好 testCoder,您的解决方案看起来很棒!所以实际上“输入名称”可以定义为任何字符串。这是对的吗?即记录的唯一seq等
【解决方案2】:

您可以使用此代码

    [HttpPost]
    public ActionResult Index(IEnumerable<HttpPostedFileBase> files) {
    foreach (var file in files) {
             if (file.ContentLength > 0) {
               var fileName = Path.GetFileName(file.FileName);
               var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
               file.SaveAs(path);
             }
    }
    return RedirectToAction("Index");
    }

这里可以检查每个文件是否存在。

【讨论】:

  • 嗨,Ruchir,我以前尝试过这个解决方案。实际上,如果我有 3 个输入但只有第 1 个和第 3 个输入具有价值,那么我得到的 files[] 给了我 2 个项目,但我现在不能属于哪个项目。相反,我需要创建另一个具有“IEnumerable files”作为属性的模型,然后将 Index() 操作的参数更改为该模型,然后我可以告诉第二个输入没有输入
  • 嗨塞缪尔,上面提到的代码适用于当您拥有动态文件上传控件并且所有控件的名称相同时。假设您当时有一个带有“添加更多”链接的文件上传控件,如果您添加 3 个控件,则 files[] 将为您提供 3 个项目,但如果您仅选择了两个文件,那么它也会提供你有 3 个项目,其中两个有文件,一个有空值。
  • 但是,如果您有 3 个固定文件上传控件,那么您可以通过提供不同的名称轻松访问它们,然后您可以访问它们,因为您可以访问属性类型为 HttpPostedFileBase 的所有其他控件。
【解决方案3】:

如果您有固定数量的文件上传控件,那么您可以像这样定义模型

    public class FileUpload
        {
            public HttpPostedFileBase FileUpload1 { get; set; }
            public HttpPostedFileBase FileUpload2 { get; set; }
            public HttpPostedFileBase FileUpload3 { get; set; }
        }

然后您可以通过操作访问它们,如下所示

     public ActionResult Index(Mvc4Application.Models.FileUpload objFileUpload)
    {
          // Do some code like here you can check for each 3 files like
          if(objFileUpload.FileUpload1 != null)
          {
             // Some code
          }
        return View();
    }

更多可以点击here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多