这更像是设计,最佳实践问题,以及部分分离关注问题。我希望你能帮我决定(并让我对好设计的迷恋)。问题基本上是关于什么应该去HtmlHelper,自己的帮手(例如,MyFancyHelper),以及什么应该去查看引擎扩展?
我们使用APS.NET MVC5 / Razor,在某些情况下,我们使用HtmlHelper扩展,自己的帮助器和WebViewPage构造。截至目前,纯文本输出用于查看引擎扩展,例如,我们的本地化就是这样完成的:
public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
private ILocalizationService _localizationService;
public override void InitHelpers()
{
base.InitHelpers();
_localizationService = (ILocalizationService)System.Web.Mvc.DependencyResolver.Current.GetService(typeof(ILocalizationService));
}
public string LS(string key, params string[] parameters)
{
return _localizationService.GetStringOrDefault(key, parameters);
}
}
所以在cshtml中,我们只能使用@LS("Domain.Subdomain.Text")
。
我们使用HtmlHelper来处理简短且重复的HTML代码,例如自定义复选框:@Html.CustomCheckbox()
。
基本上,经验法则是 - 如果产品是原始文本,基于某些参数,它将转到查看引擎扩展(WebViewPage),如果产品是HTML片段,则转到HtmlHelper。但是 - 介于两者之间的事情 - 例如,
<meta name="description" content="@???" />
在HtmlHelper中它感觉不对(它根本不是html代码),我也认为它甚至不属于视图引擎扩展(它太具体) - 并且创建自己的帮助器(例如MetaHelper)两三种方法看起来有点过分。我见过几个这样的例子:
<meta name="description" content="@(Html.MetaDescription())" />
但感觉不对,输出不是html标记。
问题是 - 你认为我刚刚描述的内容是否有意义,在这种情况下你会做什么 - 你会创建几个特定的帮助者,你是否会将这些方法保留在HtmlHelper中,你会创建不同的专业的助手,还是你会做别的什么?