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