C# 用于上传文件的MVC模型和控制器

C# 用于上传文件的MVC模型和控制器,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我的同胞们,我想确保我正确地发展这一点。我正在开发一个ASP.NETMVC5应用程序,在开发该应用程序的同时,我也在研究MVC的体系结构,以确保我真正掌握MVC的体系结构 我目前有一个视图,如下所示,允许点击提交按钮上传多个文件 <h2>Upload Multiple documents</h2>         @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multi

我的同胞们,我想确保我正确地发展这一点。我正在开发一个ASP.NETMVC5应用程序,在开发该应用程序的同时,我也在研究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" />
        }
然后将该模型称为-

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

将逻辑移到模型中是一个很好的实践。您不需要添加任何其他类来处理集合。我如何为集合编写代码?您可以将保存逻辑放在扩展方法或uploadfilemodel中
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");
}