Asp.net 如何正确处理MVC这个任务?

Asp.net 如何正确处理MVC这个任务?,asp.net,asp.net-mvc,validation,service,Asp.net,Asp.net Mvc,Validation,Service,我的任务是上传文件 class FileUploadController : Controller { public ActionResult Index(HttpPostedFileBase postedFile) { // When and how to validate it and return appropriate view and model data // How to store the file in database an

我的任务是上传文件

class FileUploadController : Controller {
     public ActionResult Index(HttpPostedFileBase postedFile) {
          // When and how to validate it and return appropriate view and model data

          // How to store the file in database and appropriately return view and model data
     }
}
验证需要检查
文件名
是否已存在(数据库访问)以及是否支持
文件扩展名
(数据库访问)

到目前为止,我的架构是这样的:

   class FileUploadController : Controller {
         public ActionResult Index(HttpPostedFileBase postedFile) {
              FileUploadModel model=new FileUploadModel();
              model.UploadedFile = postedFile;
              FileUploadService service = new FileUploadService();
              bool valid = service.Validate(postedFile);
              if (valid) {
                   FileUploadViewModel viewModel = service.Save(postedFile); 
                   return View("some_view", viewModel);
              }
              else {
                   return View("some_view", service.ViewModel);
              }
         }
    }

    public class FileUploadModel
    {
         public HttpPostedFileBase UploadedFile { get; set; }
    }

    class FileUploadViewModel {
         public ModelState ModelState;
         public String Filename;
    }

    public class FileUploadService
    {
        private FileUploadViewModel viewModel = new FileUploadViewModel();


        public FileUploadViewModel Save(FileUploadModel fileUploadModel)
        {
             // here i will just save it to the database
             // and return viewModel with valid state
        }

        public bool Validate(FileUploadModel fileUploadModel)
        {
             // I do the filename, size, etc validation here together with database validation if the file exists and appropriately attach errors to viewModel.ModelState so views can render the error
        }
    }
如您所见,我的validate方法填充
viewModel.ModelState
,我的Save方法返回new
FileUploadViewModel
。我真的拿不定主意如何设计这样它才能成长

我的问题是: -如果突然添加了更新操作和我的服务更新方法,我将需要返回不同的数据作为ViewModel,验证将不同,我是否应该创建新的ViewModel类和新的验证。。?
-我的验证是否在有效的位置进行?

很难理解您的目标。您的
FileUploadViewModel
类不应包含属性
ModelState
(如果存在验证错误,您可以将模型状态错误添加到POST方法中的
Controller.ModelState
属性)。您对文件名的验证将如何工作如果用户上载两个不同的文件,名称相同,但来自不同的目录(文件路径永远不会发回),该怎么办?无论如何,你不应该将文件存储在数据库中——使用文件服务器我的目标是组织事情,关于实际验证将如何进行不是我想要的。我在问实际的验证应该发生在哪里,以及当需要不同的验证器时会发生什么。此外,在不同情况下应如何管理ViewModel数据,具体取决于是否执行了添加操作或更新操作。验证应在控制器中进行。如果
fileUploadModel
包含无效属性,则使用
ModelState.addmodeleror()
添加模型状态错误。但一种更可靠的方法是创建一个自定义验证属性,并将其应用于您的
UploadedFile
属性,以便为您完成所有操作。例如,显示了一个验证文件扩展名的
ValidationAttribute
,如果我在控制器中添加验证,当我需要打开数据库连接时,它不是有点混乱吗,然后如果它有效,我将调用服务方法Save,它将再次打开连接,我想将它集中到服务中,但是,由于ModelState连接到控制器,它会把一切都搞乱,您仍然可以调用服务(这也是您应该做的),但是您的
SaveFile()
方法可能会返回一个
列表
,其中包含错误列表,然后您可以将其添加到
ModelState
(或者,如果没有错误,那么它实际上会进行保存)方法,这实际上意味着您要打开连接两次。但大多数验证(如文件大小或文件类型,如果合适)都可以在没有数据库连接的情况下完成,正如我前面提到的,我看不出验证文件名有什么意义。