Как отобразить информацию о клиенте, избегая использования xslt? - PullRequest
1 голос
/ 31 октября 2011

Мое место работы в настоящее время поддерживает веб-сайт для нескольких клиентов, который написан с использованием классического 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 (о котором я в настоящее время знаю немного) для преобразования данных в html.

Так что, если нам требуется информация от пользователя через форму html, xml преобразуется с использованием xsl. Затем пользователь вводит информацию и отправляет данные через форму. Страница asp затем используется для проверки данных. Эта страница asp относится к странице xsl, используемой для отображения формы. Таким образом, теперь мы находимся в положении, когда для каждого клиента у нас есть много страниц xsl и много страниц asp, относящихся к конкретному клиенту (где большая часть кода дублируется).

Меня попросили переместить сайт на asp.net mvc3 и удалить большую часть дублирования, и мне было интересно, как лучше всего удовлетворить эту специфическую для клиента функциональность на местах. Я бы предпочел, чтобы данные сохранялись в формате xml, поскольку доступ к слою базы данных осуществляется с использованием com-компонентов, которые я хотел бы использовать без изменений.

Я прочитал, что могу сохранить страницы xsl и разработать механизм просмотра xslt для отображения html. Тем не менее, я не уверен, как я проверю данные, когда пользователь отправит форму?

Как лучше всего отобразить специфичные для клиента поля, если бы мне пришлось полностью удалить xsl? Или я должен был бы иметь определенные представления клиента и модели просмотра?

Любые мысли приветствуются.

1 Ответ

1 голос
/ 31 октября 2011

Если вы действительно хотите использовать встроенную функциональность валидации / модели MVC, я думаю, что вам лучше всего будет использовать XmlSerializer или использовать DataContracts для разработки чего-то, что сериализуется в и изваш 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);                        
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...