上传文件的MVC模型和控制器
本文关键字:模型 控制器 MVC 文件 | 更新日期: 2023-09-27 18:26:04
我的社区伙伴,我想确保我正确地开发了这一点。我正在开发一个ASP.NET MVC 5应用程序,在开发该应用程序的同时,我也在真正研究MVC的体系结构,以确保我真正掌握MVC的体系架构。
我目前有一个视图(见下文),可以点击提交按钮上传多个文件。
<h2>Upload Multiple documents</h2>
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<label>Logo File: </label>
@(Html.TextBoxFor(m => m.File, new { type = "file", Id = "LogoFile" }))
<label>Privacy PDF: </label>
@(Html.TextBoxFor(model => model.File, new { type = "file", Id = "PrivacyFile" }))
<label>Payment Terms PDF: </label>
@(Html.TextBoxFor(model => model.File, new { type = "file", Id = "PaymentTerms" }))
<label>Faq File: </label>
@(Html.TextBoxFor(model => model.File, new { type = "file", Id = "FaqFile" }))
<input type="submit" value="Upload" />
}
因此,这将调用控制器(注意,我需要添加foreach循环来处理多个文件),更多内容如下-
[HttpPost]
public ActionResult Upload(UploadFileModel fileModel)
{
const string path = @"C:'_Temp'";
if (ModelState.IsValid)
{
var result = Path.GetFileName(fileModel.File.FileName);
if (result != null)
{
var sections = result.Split('''');
var fileName = sections[sections.Length - 1];
fileModel.File.SaveAs(path + fileName);
}
}
return RedirectToAction("Index");
}
然后称之为模型
public class UploadFileModel //: IEnumerable
{
[FileSize(10240)]
[FileTypes("jpg,jpeg,png,pdf")]
public HttpPostedFileBase File { get; set; }
//NEWLY ADDED AFTER COMMENTS - would I add it here?????????
public IEnumerable<UploadFileModel> UploadFileModels { get; set; }
}
我的想法是,控制器代码应该从我在网上和书中阅读的内容转移到模型中。
问题1-控制器中的代码是否应该移动到模型中?因为根据我的研究,业务逻辑应该在模型中处理。
问题2-既然这将是一个收藏(我不擅长收藏,但我正在努力成为一名大师)
a) 我是为集合添加另一个名为UploadFileModels的类,它严格针对集合,还是简单地构建UploadFileModel以固有和处理集合?如果是,如何?
谢谢。
问题1:我认为应该将代码移动到模型中。这样做的目的实际上有两个方面。1如果业务逻辑与控制器分离,则代码更易于理解和阅读。2.如果将业务逻辑与控制器逻辑解耦,测试会变得更容易,所以是的,我绝对建议将逻辑移动到模型上的函数中。
问题2:不要为集合添加类。要在你的帖子中添加一个集合,你的方法签名应该是这样的:
public ActionResult Upload(IEnumerable<UploadFileModel> fileModel)
你的模型类应该是:
public class UploadFileModel //: IEnumerable
{
[FileSize(10240)]
[FileTypes("jpg,jpeg,png,pdf")]
public HttpPostedFileBase File { get; set; }
}
您的控制器现在接收一个集合。顺便说一句,你的模型类现在确实不需要它,你可以简单地使用
public ActionResult Upload(IEnumerable<HttpPostedFileBase> fileModel)
并在控制器存储库模型中执行业务逻辑。我不建议这样做,因为如果你想更改你的控制器,这会让它变得更加困难,但值得注意的是
试试这个方法
public class UploadFileModel //: IEnumerable
{
[FileSize(10240)]
[FileTypes("jpg,jpeg,png,pdf")]
public HttpPostedFileBase File { get; set; }
public void Save() {
//Put your Saving Logic
}
}
// An Extension method for operating files
public static class Extensions{
public static void PerformSave (this IEnumerable<UploadFileModel> collection){
foreach (var item in collection)
{
item.Save();
}
}
}
将控制器更改为
public ActionResult Upload(IEnumerable<UploadFileModel> fileModels){
if (ModelState.IsValid)
{
fileModels.PerformSave();
}
return RedirectToAction("Index");
}