我有一个ASP.NET MVC网站,其中有一个下拉列表,正在视图中使用它创建...
@Html.DropDownList("Programs")
程序从Business Object集合填充,并填充到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表单值,尤其是“程序”下拉列表选择值(对于记录,还有一个复选框,我无法从中读取值。)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
}
使用声明应该将表单值和文件作为ActionResult的单独参数?
编辑我的编辑
似乎我不必进行任何更改......调试器显示文件和表单都是非空的。凉!是吗?
答案 0 :(得分:7)
我认为应该这样做
[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
答案 1 :(得分:1)
使用包含已发布文件和表单值的ViewModel类型,或使用HttpRequest
(通过Controller.Request
属性访问)对象,该对象具有.Form[key]
的POST值和{ {1}}用于发布的文件。