C# ASP.Net MVC:图像上载不起作用
我对ASP.Net(以及一般的webdev)是新手,我正在尝试实现一个提供类似简历功能的网站。其中之一就是上传并查看一个人的简历照片。通过使用脚手架和在中找到的代码示例,我成功地提出了以下代码,其中有问题的部分被一个更大的空间包围:C# ASP.Net MVC:图像上载不起作用,c#,asp.net-mvc,C#,Asp.net Mvc,我对ASP.Net(以及一般的webdev)是新手,我正在尝试实现一个提供类似简历功能的网站。其中之一就是上传并查看一个人的简历照片。通过使用脚手架和在中找到的代码示例,我成功地提出了以下代码,其中有问题的部分被一个更大的空间包围: 作者 @Html.ValidationSummary(true,“,new{@class=“text danger”}) @Html.HiddenFor(model=>model.PersonID) @LabelFor(model=>model.Name,htm
作者
@Html.ValidationSummary(true,“,new{@class=“text danger”})
@Html.HiddenFor(model=>model.PersonID)
@LabelFor(model=>model.Name,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.Name,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Name,“,new{@class=“text danger”})
@LabelFor(model=>model.Picture,htmlAttributes:new{@class=“controllabel col-md-2”})
@使用(Html.BeginForm(“FileUpload”、“CV”、FormMethod.Post、new{enctype=“multipart/formdata”}))
{
}
@LabelFor(model=>model.MobileNum,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.MobileNum,new{htmlAttributes=new{@class=“form control”}})
@Html.ValidationMessageFor(model=>model.MobileNum,“,new{@class=“text danger”})
@LabelFor(model=>model.Location,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.Location,new{htmlAttributes=new{@class=“form control”}})
@Html.ValidationMessageFor(model=>model.Location,“,new{@class=“text danger”})
@LabelFor(model=>model.LinkedIn,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.LinkedIn,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.LinkedIn,“,new{@class=“text danger”})
这是视图中负责上传的相关部分,而Controller
CV中我想要处理请求的方法如下:
[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase file)
{
if (file != null)
{
string pic = System.IO.Path.GetFileName(file.FileName);
string path = System.IO.Path.Combine(
Server.MapPath("~/Content/Images"), pic);
// file is uploaded
file.SaveAs(path);
// save the image path path to the database or you can send image
// directly to database
// in-case if you want to store byte[] ie. for DB
using (MemoryStream ms = new MemoryStream())
{
file.InputStream.CopyTo(ms);
byte[] array = ms.GetBuffer();
//now I only have 1 mock author
db.Authors.FirstOrDefault().Picture = array;
}
}
// after successfully uploading redirect the user
return View();
}
我的问题是,尽管指定了
操作
和控制器
名称,并且VS能够将视图
连接到控制器
(至少它在转到控制器
命令上滑动到相应的位置),但出于某种原因,post从未点击过此方法。我肯定这是新手犯的错误,但我就是找不到原因 您问题中的代码没有显示它,但事实上您在
元素前后都有表单控件,这表明您有一个外部
元素,并解释了为什么内部
没有点击FileUpload()
方法
嵌套表单是无效的html,不受支持。无法保证在不同的浏览器或版本中会有什么行为,但大多数浏览器都会为内部表单的成功表单控件生成名称/值对,但会将其发布到外部表单的action
属性中
不清楚为什么要单独上传文件,这意味着如果用户在其他表单控件中输入数据并提交内部表单,所有这些都将丢失。删除内部表单并将整个模型(包括文件输入)回发到一个控制器方法会更容易(通过向该方法添加HttpPostedFileBase file
参数,或者更好地使用具有HttpPostedFileBase file
属性的视图模型)。请注意,表单将需要enctype=“multipart/form data”
属性
如果您确实想单独上传,那么一个选项是使用ajax,使用FormData
将文件输入提交给控制器,这样至少用户已经输入的任何数据都不会丢失。有关示例,请参阅。在本例中,您将初始化FormData
的一个新实例和.append()
文件输入的值
作为补充说明,您的
@Html.LabelFor(model=>model.Picture)
没有创建与文件输入相关联的标签(您没有带有id=“Picture”
的表单控件)显示的代码应该可以正常工作。你看起来很奇怪(在
内部有一个
,所以最好的猜测是您有无效html的嵌套表单,不支持。谢谢,这是问题的根源。如果您可以将其转换为带有某种解释的答案,我很乐意接受它作为答案。您需要编辑您的问题以显示外部表单(否则答案就没有多大意义)我添加了更多的代码是的,我的代码中有一个外部形式,但它更进一步,这就是为什么我没有在这里包含它。上传图片和其他信息会很好,但我仍然在想如何理解ASP中的Html帮助器
类。如果你能指导我找到一个好的一致性解决方案,那就更好了非常感谢。您不了解哪一点?除了我注意到的标签,您显示的其余视图代码看起来很好之外,您应该使用一个包含公共HttpPostedFileBase文件{get;set;}
属性的标签,并使用@Html.LabelFor(m=>m.File)@Html.TextBoxFor(m=>m.File,new{type=“File”})
然后您还可以添加验证属性和@Html.ValidationMessageFor(m=>m.File)
-例如a或FileSizeAttribute
不确定您为什么认为需要这样做。您可以通过一个操作保存文件和数据(您是将文件保存到文件服务器并将路径和文件显示名称保存在数据库中,还是将文件保存在数据库中作为字节[]
?)我正在尝试