用于上载文件的MVC模型和控制器

时间:2014-10-08 13:02:56

标签: c# asp.net asp.net-mvc

我的同乡,我想确保我正确地发展这一点。我正在开发一个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构建为固有集合并处理集合,如果是,如何?

谢谢。

2 个答案:

答案 0 :(得分:0)

问题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)

并在控制器存储库模型中执行您的商务逻辑。我不建议这样做,因为如果你想对你的控制器进行更改会让它变得更加困难,但值得注意

答案 1 :(得分:0)

试试这个方法

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