我想将Pdf文件上传到我的应用程序
所以我有ViewModel(我只发布相关代码)
public class SubcategoryViewModel
{
public HttpPostedFileBase PdfFile { get; set; }
[DisplayName("PDF")]
public string Pdf { get; set; }
}
控制器:
public async Task<string> CreateSubcategory(SubcategoryViewModel model)
{
string pdf = null;
if (model.Pdf != null)
{
pdf = Guid.NewGuid().ToString().Substring(0, 13) + "_" + model.File.FileName;
model.Pdf = pdf;
var path = Path.Combine(HttpContext.Current.Server.MapPath("~/Content/pdf"), pdf);
model.File.SaveAs(path);
}
var subcategory = new Subcategory
{
Pdf = pdf,
};
db.SubcategoriesList.Add(subcategory);
await db.SaveChangesAsync();
查看:
@model Models.ViewModels.SubcategoryViewModel
@using (Html.BeginForm("Create", "Subcategory", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-group">
@Html.LabelFor(model => model.Pdf, new { @class = "control-label col-md-2" })
<div class="col-md-10 legend-size">
<input type="file" id="file" name="file" />
</div>
</div>
当我发布帖子时,我没有收到任何模型.Pdf,所以进入if (model.Pdf != null)
验证它是空的,我不知道为什么
任何人都知道它为什么会发生?谢谢你提前!
答案 0 :(得分:1)
您有两个主要问题。首先,文件输入的名称为name="file"
,但这与模型中的属性不匹配。它必须是
<input type="file" name="PdfFile" />
其次,您永远不会为属性string Pdf
生成输入,因此在POST方法中,它始终为null
,因此if (model.Pdf != null)
中的代码将永远不会被执行。但是,你真正想要的是保存文件,如果它不是null,所以代码需要
public async Task<string> CreateSubcategory(SubcategoryViewModel model)
{
string fileName = null;
if (model.PdfFile != null && model.PdfFile .ContentLength > 0)
{
fileName = Guid.NewGuid().ToString().Substring(0, 13) + "_" + model.PdfFile.FileName;
string path = Path.Combine(HttpContext.Current.Server.MapPath("~/Content/pdf"), fileName);
model.PdfFile.SaveAs(path);
}
var subcategory = new Subcategory
{
Pdf = fileName ,
};
db.SubcategoriesList.Add(subcategory);
await db.SaveChangesAsync();
附注:我还建议在模型中为文件显示名称(即model.PdfFile.FileName
的值)添加一个附加属性,以便您可以在视图中使用该属性,而不是显示带有前缀{的名称。 {1}}对用户没什么意义。有关示例,请参阅this answer。
答案 1 :(得分:0)
我认为您的问题是您在模型的PdfFile
属性中获得空值。这是因为您没有给出与您属性相同的文件上传控件的name
属性。将文件上传控件的name
属性更改为PdfFile
。
<input type="file" id="file" name="PdfFile" />