我正在创建一个 MVC 应用程序,当前使用 EditorFor 生成大量视图。整个视图基本上只是一个 EditorForModel,而且效果很好。然而,我遇到了一个小问题,我似乎找不到解决方案,重要的是它按照我需要的方式工作,那就是在尝试渲染 EditorFor 界面时。绑定和类似的一切都已处理完毕,但问题是 EditorFor 认为它是一个接口,并且默认为“Object”模板。我需要它查看界面,看看它是否可以找到具有该名称的模板,如果找不到,我需要它查看所有存在的界面,看看它是否与其中任何一个匹配。为了更简单地解释它,请看这个例子:
接口:
public interface IAppProvider
{
string Name { get; set; }
}
public interface IAppMusicProvider : IAppProvider
{
int GetPlaylistCount();
} // Yeah, I know, this interface is not smart, but it's only for show.
如果我现在创建一个模型为“IAppMusicProvider”的视图,然后运行Html.EditorForModel()
,我需要它来找到“~Views\Shared\EditorTemplates\IAppProvider.cshtml”模板。有什么简单的方法可以实现这一目标吗?
你可以尝试改变ModelMetadata.TemplateHint
in the ModelMetadataProvider
。一种方法是使用装饰器模式:
public class AbstractTypeTemplateSupportingModelMetadataProvider : ModelMetadataProvider
{
private readonly ModelMetadataProvider wrapped;
public AbstractTypeTemplateSupportingModelMetadataProvider(ModelMetadataProvider wrapped)
{
this.wrapped = wrapped;
}
public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)
{
var result = this.wrapped.GetMetadataForProperties(container, containerType).ToList();
result.ForEach(ChangeTemplateHint);
return result;
}
public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName)
{
var result = this.wrapped.GetMetadataForProperty(modelAccessor, containerType, propertyName);
ChangeTemplateHint(result);
return result;
}
public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType)
{
var result = this.wrapped.GetMetadataForType(modelAccessor, modelType);
ChangeTemplateHint(result);
return result;
}
private void ChangeTemplateHint(ModelMetadata source)
{
if (source.Model is IAppProvider) //Or use source.ModelType if you want to support the model being null.
source.TemplateHint = typeof(IAppProvider).Name;
}
}
在你的启动逻辑中:
ModelMetadataProviders.Current = new AbstractTypeTemplateSupportingModelMetadataProvider(ModelMetadataProviders.Current);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)