2015-06-18 22 views
-1

我有两个可能相同的方法,像这样:重构方法,asp.net mvc4

[HttpGet] 
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model) 
{ 

    string customerSchema = SfsHelpers.StateHelper.GetSchema(); 
    TemplateLibraryEntry entry = GetTemplateLibraryEntry(model.DesignId, customerSchema); 
    var path = Path.Combine(Server.MapPath("~/"), entry.FilePath); 
    model.DesignId = designId; 
    model.Directories = new List<string>(); 
    model.Directories.Add("/"); 
    model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories)); 
    for (int i = 1; i < model.Directories.Count; i++) { 
     model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/'); 
    } 
    model.Directories.Sort(); 

    return View(model); 
} 

而且这种方法:

public void GetUploadFileFolders(UploadViewModel model, string designId) 
{ 
    string customerSchema = SfsHelpers.StateHelper.GetSchema(); 
    TemplateLibraryEntry entry = GetTemplateLibraryEntry(designId, customerSchema); 
    var path = Path.Combine(Server.MapPath("~/"), entry.FilePath); 
    model.DesignId = designId; 
    model.Directories = new List<string>(); 
    model.Directories.Add("/"); 
    model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories)); 
    for (int i = 1; i < model.Directories.Count; i++) { 
     model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/'); 
    } 
    model.Directories.Sort(); 
} 

但有可能这两种方法结合起来的一种方法?

但如何结合这两种方法?

谢谢

但如何改变这种:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult UploadFile(UploadViewModel uploadViewModel) 
    { 
     CreateDirectoryModel model = new CreateDirectoryModel(); 
     try { 
      GetUploadFileFolders(model, uploadViewModel.DesignId); 
      //GetUploadFileFolders(uploadViewModel, uploadViewModel.DesignId); 
      string validationError = null; 

      bool fileUploaded = (uploadViewModel.UploadData != null) && (uploadViewModel.UploadData.ContentLength > 0) && !string.IsNullOrEmpty(uploadViewModel.UploadData.FileName); 

      if (ModelState.IsValid && fileUploaded) { 
       var extension = Path.GetExtension(uploadViewModel.UploadData.FileName).TrimStart('.'); 
       if (!Seneca.SfsLib.FileSystemHelper.UploadOptInExtensions.Contains(extension)) { 
        ViewBag.Message = Resources.Entity.DesignTemplate.NotAllowedExtension; 
        return View(uploadViewModel); 
       } 

       var fileName = Path.GetFileName(uploadViewModel.UploadData.FileName); 

       TemplateLibraryEntry entry = GetTemplateLibraryEntry(uploadViewModel.DesignId, customerSchema); 
       string folder = uploadViewModel.Directories[uploadViewModel.SelectedFolderId]; 
       var path = Path.Combine(Server.MapPath("~/"), entry.FilePath, folder.Replace('/', '\\').Trim('\\'), fileName); 


       if (!System.IO.File.Exists(path)) { 
        uploadViewModel.UploadData.SaveAs(path); 
        return RedirectToAction(uploadViewModel.DesignId, "DesignTemplate/File"); 
       } 

       validationError = Resources.Entity.DesignTemplate.FileAlreadyExists; 
      } 
      if (!fileUploaded) 
       validationError = Resources.Entity.DesignTemplate.FileNotSelected; 

      GetUploadFileFolders(model, uploadViewModel.DesignId); 
      ViewBag.Message = validationError; 
      return View(uploadViewModel); 
     } 
     catch (Exception ex) { 
      Logger.Current.LogMessage(LogType.Warning, StateHelper.GetSchema(), LogCategory.Sfs, "Unable to upload file: {0}", ex.ToString()); 
      AddDelayedNotification(Resources.Entity.DesignTemplate.FileCouldNotBeUploaded, Notification.NotificationType.Error); 
     } 
     return View(uploadViewModel); 
    } 
+0

函数是reusables ,您可以创建函数并从这两个操作中调用相同的操作。或者您可以从上面的操作中调用GetUploadFileFolders方法。 –

+0

是的,有可能......你停在哪一步? –

+2

取决于模型类是如何相互关联的。 – fero

回答

0

您可以创建在UploadViewModel属性为我所看到的一切性质都是一样的:

public class UploadViewModel 
{ 

    CreateDirectoryModel createModel {get;set;} 
} 

public void GetUploadFileFolders(CreateDirectoryModel model, string designId) 
{ 
    string customerSchema = SfsHelpers.StateHelper.GetSchema(); 
    TemplateLibraryEntry entry = GetTemplateLibraryEntry(designId, customerSchema); 
    var path = Path.Combine(Server.MapPath("~/"), entry.FilePath); 
    model.DesignId = designId; 
    model.Directories = new List<string>(); 
    model.Directories.Add("/"); 
    model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories)); 
    for (int i = 1; i < model.Directories.Count; i++) 
    { 
     model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/'); 
    } 

    model.Directories.Sort(); 

} 

,并在你的动作:

[HttpGet] 
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model) 
{ 
    GetUploadFileFolders(model,designId) 
    return View(model); 
} 

和使用它的UploadViewModel时,你可以现在就做:

GetUploadFileFolders(model.creatModel,designId); 
+0

谢谢,我编辑我的帖子 – InfinityGoesAround

+0

但是,如果这样做,我发布在这里。然后找不到目录。 – InfinityGoesAround

1

你可以用它定义你需要两个类部件的接口(或基类):

public interface IMyModel 
{ 
    string DesignId { get; set; } 
    List<string> Directories { get; set; } 
} 

你的类(或至少CreateDirectoryModel)然后必须实现的接口:

public class CreateDirectoryModel : IMyModel 
{ 
    // ... 
} 

在你改变了参数类型IMyModel这样的第二种方法:

public void GetUploadFileFolders(IMyModel model, string designId) 
{ 
    // ... 
} 

然后,您可以从第一种方法调用第二种方法。

[HttpGet] 
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model) 
{ 
    GetUploadFileFolders(model, designId); 
    return View(model); 
} 
+0

谢谢。这是一种方法的组合 – InfinityGoesAround

0

使用常规的基于映射Automapper你可以将它们合并为

[HttpGet] 
    public ActionResult CreateDirectory(string designId, CreateDirectoryModel model) 
    { 

     string customerSchema = SfsHelpers.StateHelper.GetSchema(); 
     TemplateLibraryEntry entry = GetTemplateLibraryEntry(model.DesignId, customerSchema); 
     var path = Path.Combine(Server.MapPath("~/"), entry.FilePath); 
     model.DesignId = designId; 
     model.Directories = new List<string>(); 
     model.Directories.Add("/"); 
     model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories)); 
     for (int i = 1; i < model.Directories.Count; i++) { 
      model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/'); 
     } 
     model.Directories.Sort(); 
     // 
     Mapper.CreateMap<CreateDirectoryModel,UploadViewModel>(); 
     var uploadmodel=Mapper.Map<UploadViewModel>(model); 
     uploadmodel.Directories.Sort(); 
     // 
     return View(model); 
    } 

但是我建议你,如果这两个类不是专门的,使用其中一个,从而减少redundency