Как реализовать форму адресации для конкретной культуры, используя ASP.NET MVC? - PullRequest
1 голос
/ 13 июля 2010

В настоящее время у нас есть элемент управления WebForms с панелью обновлений.Код позади содержит логику для отображения / скрытия полей в зависимости от выбранной страны.Это хорошо для WebForms, но мы переходим на MVC, и мне трудно разобраться с этим.Мне также нужно, чтобы это было локализовано, как с точки зрения локализуемых строк ресурсов, так и отображения различных полей формы для разных стран.

В настоящее время строки ресурсов хранятся в файле .resx в папке Resources.Наши поля адресов для каждой страны хранятся в XML-документе, который мы загружаем и анализируем при изменении страны.Затем он используется, чтобы найти соответствующие элементы управления и показать / скрыть те, которые необходимы.Последний бит, который я пытаюсь решить, это сообщения проверки. Отражение не работает с классами ресурсов, и я не знаю ни одной утилиты, позволяющей использовать переменные в определении атрибута.

Я думал об использовании преобразования XSL для созданиябит адреса из наших постоянных полей адреса.Это правильный подход?

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

Вы по-прежнему сможете выводить текст на правильном языке, просто перейдя в сам ресурс.Вспомогательный метод может упростить ввод / более читаемый текст, но при этом вы получите правильную форму.

Для отображения различных элементов управления вы можете создать частичный элемент, относящийся к определенной стране, и динамически загрузить его, что-то вроде:

<%= Html.RenderPartial("_addressForm-" + countryCode) %>

Опять же, вспомогательный метод может сделать это проще / прозрачнее.

Наконец, какой тип проверки вы используете?Встроенные атрибуты проверки MVC2 от модели представления?Если это так, я считаю, что это встроено в атрибуты, которые вы используете для указания обязательных полей и т. Д.

Надеюсь, это поможет.

0 голосов
/ 22 июля 2010

Я обнаружил, что пытался некорректно использовать отражение для своего типа ресурса и смог создать несколько методов для получения правильного ресурса:

public string GetLabel(string control)
{
    string strResourceName;
    try
    {
        AddressInfoField field = AddressFields.First(f => f.m_strControl == control);
        strResourceName = field.m_strName;
    }
    catch // Catch everything
    {
        return string.Empty;
    }

    if (string.IsNullOrEmpty(strResourceName))
        return string.Empty;

    return GetResource(strResourceName);
}

public string GetValidationMessage(string control)
{
    string strResourceName;
    try
    {
        AddressInfoField field = AddressFields.First(f => f.m_strControl == control);
        strResourceName = field.m_strName;
    }
    catch // Catch everything
    {
        return Addressing.Required;
    }

    if (string.IsNullOrEmpty(strResourceName))
        return Addressing.Required;

    return GetResource(strResourceName + "Required");
}

private static string GetResource(string strResourceName)
{
    PropertyInfo property = typeof (Addressing).GetProperty(strResourceName, BindingFlags.Public | BindingFlags.Static);
    if (property == null)
        throw new InvalidOperationException("Could not locate a resource for Addressing." + strResourceName);
    if (property.PropertyType != typeof(string))
        throw new InvalidOperationException("The requested resource does not return a string.");
    return (string) property.GetValue(null, null);
}

Тогда в моем представлении Spark я могу использовать:

<li id="city" if="Model.IsCityVisible">
    <label for="City">${Model.GetLabel("City")}</label>
    ${Html.EditorFor(x => x.City)}
    !{Html.ValidationMessage("City", Model.GetValidationMessage("City"))}
</li>
...