2011-10-31 71 views
1

我的工作地点目前为几个客户维护一个网站,这是使用传统的asp编写的。每个客户都需要特定的网站特定部分。如何显示避免使用xslt的客户特定信息?

例如,客户A需要一个地址被输入,显示和存储在下面的格式:

Address Line 1 
Address Line 2 
Address Line 3 
Address Line 4 
Address Line 5 
Postcode 

而客户B需要的地址被输入,显示和存储的:

Street 
Town 
City 
Postcode 

等等...

因此,我工作的地方把数据存储为数据库中的XML和使用XSL(其中我目前知道上火的路径tle)将数据转换为html。

因此,如果我们需要用户通过html表单获得的信息,则使用xsl转换xml。用户然后输入信息并通过表单提交数据。然后使用一个asp页面来验证数据。此asp页面特定于用于显示表单的xsl页面。因此,我们现在正在为每个客户提供多个xsl页面和许多客户特定的asp页面(其中大部分代码都是重复的)。

我被要求将网站移至asp.net mvc3并删除大量重复内容,并想知道如何满足客户特定领域的功能。我的首选是将数据保存为xml,因为数据库层是使用com组件访问的,我想在不改变的情况下重用它们。

我读过我可以保留xsl页面并开发一个xslt视图引擎来显示html。但是,我不确定如何在用户提交表单时验证数据?

如果我要完全删除xsl,显示客户特定字段的最佳方式是什么?或者我是否必须拥有客户特定的视图和视图模型?

任何想法将不胜感激。

回答

1

如果你真的想要使用MVC内置的验证/模型功能,我认为你最好的选择是使用XmlSerializer或者使用DataContracts来开发一些序列化XML和XML数据(一旦它从COM对象中获取,因此您不需要重新编写这些代码),那么您可以将这些类用作MVC模型,并使用标准数据注释来利用更丰富的MVC模型功能,并完全跳过XSL步骤。

为了将它与一个自定义的特定视图相结合,我通常所做的就是重写默认视图引擎,使其具有一个实际将尝试更具体到客户/对象的名称,然后回退到常规名称的名称。

这个视图引擎允许你传递一个视图来传递一个视图名称(例如,FallbackViewEngine.BuildViewName("General", "Customer Name"),它会首先查找“General.Customer Name.cshtml”,然后是“General.cshtml”作为后备。您实际上可以在您的视图文件夹中使用客户特定的视图。

public class FallbackViewEngine : RazorViewEngine 
{ 
    const string NameSeparator = "=="; 
    const string FileSeparator = "."; 

    public static string BuildViewName(string root, params string[] fallbackList) 
    { 
     if (string.IsNullOrWhiteSpace(root)) throw new ArgumentNullException("root"); 
     if (fallbackList == null) throw new ArgumentNullException("fallbackList"); 

     var sb = new StringBuilder(root); 

     foreach (var s in fallbackList) 
     { 
      if (string.IsNullOrWhiteSpace(s)) continue; 

      sb.Append(NameSeparator); 
      sb.Append(s); 
     } 

     return sb.ToString(); 
    } 

    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     if (string.IsNullOrWhiteSpace(viewName)) throw new ArgumentNullException("viewName"); 

     var names = viewName.Split(new string[] {NameSeparator}, StringSplitOptions.None); 

     var searched = new List<string>(); 

     //iterate from specific to general 
     for (var i = names.Length; i >= 1; i--) 
     { 
      var result = base.FindView(controllerContext, string.Join(FileSeparator, names, 0, i), masterName, useCache); 

      if (result.View != null) 
      { 
       return result; 
      } 
      else 
      { 
       searched.AddRange(result.SearchedLocations); 
      } 
     } 

     return new ViewEngineResult(searched);       
    } 
} 
相关问题