我们目前有一个带有更新面板的WebForms控件。代码隐藏包含基于所选国家/地区显示/隐藏字段的逻辑。这对于WebForms来说很好,但我们正在转向MVC,而我很难将其整理出来。我还需要根据可本地化的资源字符串进行本地化,以及为不同国家/地区显示不同的表单字段。
我们目前将资源字符串存储在Resources文件夹中的.resx文件中。我们每个国家/地区的地址字段存储在我们在国家/地区更改时加载和解析的XML文档中。然后,这用于定位相应的控件并显示/隐藏必要的控件。我正在尝试解决的最后一点是验证消息。 Reflection对资源类不起作用,我不知道在属性定义中允许变量的任何实用程序。
我曾想过使用XSL转换从持久化地址字段创建地址位。这是一种有效的方法吗?
答案 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>