如何使用ASP.NET MVC实现特定于文化的地址表单?

时间:2010-07-12 23:12:48

标签: forms asp.net-mvc-2 localization webforms culture

我们目前有一个带有更新面板的WebForms控件。代码隐藏包含基于所选国家/地区显示/隐藏字段的逻辑。这对于WebForms来说很好,但我们正在转向MVC,而我很难将其整理出来。我还需要根据可本地化的资源字符串进行本地化,以及为不同国家/地区显示不同的表单字段。

我们目前将资源字符串存储在Resources文件夹中的.resx文件中。我们每个国家/地区的地址字段存储在我们在国家/地区更改时加载和解析的XML文档中。然后,这用于定位相应的控件并显示/隐藏必要的控件。我正在尝试解决的最后一点是验证消息。 Reflection对资源类不起作用,我不知道在属性定义中允许变量的任何实用程序。

我曾想过使用XSL转换从持久化地址字段创建地址位。这是一种有效的方法吗?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

我发现我试图对我的资源类型错误地使用反射,并且能够创建一些方法来获取正确的资源:

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>