Asp.net mvc 3 如何使用xslt显示特定于客户的信息?

Asp.net mvc 3 如何使用xslt显示特定于客户的信息?,asp.net-mvc-3,xslt,Asp.net Mvc 3,Xslt,我的工作地点目前为几个客户维护一个使用经典asp编写的网站。每个客户都要求网站的特定部分专门写给他们 例如,客户A要求以以下格式输入、显示和存储地址: Address Line 1 Address Line 2 Address Line 3 Address Line 4 Address Line 5 Postcode 鉴于客户B要求将地址输入、显示和存储为: Street Town City Postcode 等等 因此,我的工作地点选择了将数据作为xml存储在数据库中,并使用xsl(我目前

我的工作地点目前为几个客户维护一个使用经典asp编写的网站。每个客户都要求网站的特定部分专门写给他们

例如,客户A要求以以下格式输入、显示和存储地址:

Address Line 1
Address Line 2
Address Line 3
Address Line 4
Address Line 5
Postcode
鉴于客户B要求将地址输入、显示和存储为:

Street
Town
City
Postcode
等等

因此,我的工作地点选择了将数据作为xml存储在数据库中,并使用xsl(我目前对xsl知之甚少)将数据转换为html

因此,如果我们需要通过html表单从用户那里获得信息,xml将使用xsl进行转换。然后,用户输入信息并通过表单提交数据。然后使用asp页面验证数据。此asp页面特定于用于显示表单的xsl页面。因此,我们现在的处境是,对于每个客户,我们都有许多xsl页面和许多特定于客户的asp页面(其中许多代码是重复的)

我被要求将网站迁移到asp.net mvc3,并删除大部分重复内容,我想知道什么是满足此客户特定领域功能的最佳方式。我的首选是,在使用com组件访问数据库层时,将数据存储为xml,我希望在不更改的情况下重用com组件

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

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


任何想法都将不胜感激。

如果您真的想使用MVC的内置验证/模型功能,我认为您最好的选择是使用or来开发与XML之间的序列化(一旦从COM对象检索到XML,您就不需要重新编码),然后,您可以使用这些类作为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);                        
    }
}
公共类FallbackViewEngine:RazorViewEngine
{
常量字符串名称分隔符=“=”;
常量字符串FileSeparator=“.”;
公共静态字符串BuildViewName(字符串根,参数字符串[]回退列表)
{
if(string.IsNullOrWhiteSpace(root))抛出新的ArgumentNullException(“root”);
如果(fallbackList==null)抛出新的ArgumentNullException(“fallbackList”);
var sb=新的StringBuilder(根);
foreach(回退列表中的var s)
{
如果(string.IsNullOrWhiteSpace)继续;
某人附加(姓名分隔符);
某人追加;
}
使某人返回字符串();
}
public override ViewEngineResult FindView(ControllerContext ControllerContext、string viewName、string masterName、bool useCache)
{
if(string.IsNullOrWhiteSpace(viewName))抛出新的ArgumentNullException(“viewName”);
var names=viewName.Split(新字符串[]{NameSeparator},StringSplitOptions.None);
var searched=新列表();
//从特定到一般迭代
对于(var i=names.Length;i>=1;i--)
{
var result=base.FindView(controllerContext,string.Join(FileSeparator,names,0,i),masterName,useCache);
如果(result.View!=null)
{
返回结果;
}
其他的
{
searched.AddRange(result.SearchedLocations);
}
}
返回新的ViewEngineResult(已搜索);
}
}

如果您真的想使用MVC的内置验证/模型功能,我认为您最好的选择是使用or来开发与XML之间的序列化(一旦从COM对象检索到XML,您就不需要重新编码),然后您可以使用这些类作为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);                        
    }
}
公共类FallbackViewEngine:RazorViewEngine
{
常量字符串名称分隔符=“=”;
常量字符串FileSeparator=“.”;
公共静态字符串BuildViewName(字符串根,参数字符串[]回退列表)
{
if(string.IsNullOrWhiteSpace(root))抛出新的ArgumentNullException(“root”);
如果(fallbackList==null)抛出新的ArgumentNullException(“fallbackList”);
var sb=新的StringBuilder(根);
foreach(回退列表中的var s)
{
如果(string.IsNullOrWhiteSpace)继续;
某人(姓名)附加