上传文件的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以固有和处理集合?如果是,如何?

谢谢。

上传文件的MVC模型和控制器

问题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");
}