9

我有一个 ASP.NET MVC 网站,它有一个在视图中使用它创建的下拉列表...

@Html.DropDownList("Programs")

程序是从业务对象集合中填充的,并在 Home Controller 上的索引操作中填充到 ViewBag 中......

\\get items...
ViewBag.Programs = items;

该视图还可能包含三个我在同一个视图中得到的文件......

<input type="file" name="files" id="txtUploadPlayer" size="40" />  
<input type="file" name="files" id="txtUploadCoaches" size="40" />  
<input type="file" name="files" id="txtUploadVolunteers" size="40" /> 

所有上述控件都包含在一个表单中,该表单使用...在视图中创建

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
     <!--  file and other input types  -->
     <input type="submit" name="btnSubmit" value="Import Data" />
}

我的问题是我找不到处理所有文件和引用表单字段的方法。

具体来说,我需要知道用户从下拉列表中选择的程序。

我可以毫无问题地使用此代码处理文件...

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files)
//public ActionResult Index(FormCollection form)
{

    _tmpFilePath = Server.MapPath("~/App_Data/uploads");

    if (files == null) return RedirectToAction("Index");
    foreach (var file in files)
    {
        if (file != null && file.ContentLength > 0)
        {
            var fileName = Path.GetFileName(file.FileName);
            var path = Path.Combine(_tmpFilePath, fileName);
            if (System.IO.File.Exists(path)) System.IO.File.Delete(path);

            _file = file;

            file.SaveAs(path);

            break;  //just use the first file that was not null.
        }
    }



    //SelectedProgramId = 0;

    //DoImport();

    return RedirectToAction("Index");
}

但是我不知道如何还可以访问 POST 表单值,尤其是 Programs 下拉列表中的选定值(并且作为记录,还有一个复选框,我无法从中读取值。)Fiddler 向我展示了响应具有文件引用和选择的程序,但我不知道如何使用 ASP.NET MVC 将它们从 POST 中取出。

我知道这个问题非常基础,但我仍在学习整个 web/http 的东西,而不仅仅是 MVC。

编辑 感谢您的回答。我认为答案可能在于将文件和表单值都传递到 POST 中。

所以我的最后一个问题是......如何更改 HTML.BeginForm 块以同时传递文件和表单值?现在我有...

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  //do stuff
}

该 using 语句应该如何获取表单值和文件作为 ActionResult 的单独参数?

编辑我的编辑
看来我不需要做任何更改...调试器显示文件和表单都是非空的。凉爽的!是对的吗?

4

2 回答 2

8

我认为这应该这样做

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files, FormCollection form)
{
  //handle the files

  //handle the returned form values in the form collection
}

您应该能够在 [HttpPost] 操作中传入 2 个参数。您也可以传入 HTML 名称。

编辑:我在 ASP.net 中的表单也有问题。我建议查看 Scott Allen 的这篇博文。 http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx

于 2012-10-24T21:05:07.853 回答
1

Use a ViewModel type that contains both the posted files and form values, or use the HttpRequest (accessed via the Controller.Request property) object, which has .Form[key] for POST values and .Files[key] for posted files.

于 2012-10-24T21:05:11.623 回答