传递一个额外的参数以及HttpPostedFileBase来上传单个文件

时间:2019-04-10 11:35:17

标签: javascript c# html asp.net-mvc razor

在我的MVC应用程序中,我有一个包含以下内容的视图 1.一个下拉列表 2.上传一个文件 3.一键提交表格。

表单代码(查看)

<form id="upload" enctype="multipart/form-data" action="@Url.Action("ExcelUpload", "NBL")" method="POST">


  @Html.DropDownList("CustomerName", new List<SelectListItem>
  {
      new SelectListItem() {Text = "Customer 1", Value="CM1"},
      new SelectListItem() {Text = "Customer 2", Value="CM2"}
  }, new { @class = "form-control", @style = "width:auto" })


  <input type="file" name="fileUpload" id="fileUpload" size="23" style="margin-top:5px"/>

  <button class="btn btn-primary">Upload</button> 

</form>

当我单击按钮时,我能够在控制器中成功传递文件。

控制器代码

public ActionResult ExcelUpload(HttpPostedFileBase FileUpload)
{
    if (FileUpload != null)
    {
         // Do Stuff here.
    }
}

我的问题是,当我单击按钮时,我还希望控制器中的下拉选定值。如何在控制器中同时传递“下拉选定值”和文件?

2 个答案:

答案 0 :(得分:0)

问题在于您的模型并不代表您要使用的视图或数据。因此,建立一个像这样的模型:

using System.ComponentModel.DataAnnotations;

namespace Models
{
    public class MyUploadModel
    {
        [Required]
        public HttpPostedFileBase File { get; set; }
        [Required] 
        public string CustomerName { get; set; }
    }
} 

在视图中使用该模型生成表单,然后在控制器中使用

public ActionResult ExcelUpload(Models.MyUploadModel myModel)
{
    if (ModelState.IsValid)
    {
        // all good, save                
    }

    return View(myModel);
}

当然,您可以在操作中添加一个字符串参数,但这更加健壮,并且可以表示MVC模式(模型/视图/控制器)。

答案 1 :(得分:0)

下拉元素的名称为CustomerName,位于表单中。浏览器会将其作为键值对发布到服务器,其中键是下拉列表的名称,而值将是用户选择的值。

MVC框架的默认联编程序将查找名为ExcelUpload的操作,该操作具有参数string customerName或具有复杂类型(Model)且具有CustomerName作为财产。

将您的操作更改为:

ExcelUpload(HttpPostedFileBase FileUpload, string customerName)