我想用我自己的具有完全相同的签名(但当然是不同的 namespace )的帮助程序覆盖Html.TextBoxFor(),这可能吗?如果可以,怎么办?
原因是我在一个现有的应用程序中拥有100多个 View ,并且我想更改TextBoxFor的行为,以便在该属性具有[StringLength(n)]批注的情况下输出maxLength = n属性。
在此问题中,用于自动输出maxlength = n的代码是maxlength attribute of a text box from the DataAnnotations StringLength in Asp.Net MVC。但是我的问题不是重复的-我正在尝试创建一个更通用的解决方案:DataAnnotaion会自动将HTML流入html,而编写 View 的人员不需要任何其他代码。
在引用的问题中,您必须将每个Html.TexBoxFor都更改为Html.CustomTextBoxFor。我需要这样做,以便不需要更改现有的TextBoxFor()-因此创建具有相同签名的助手:更改助手方法的行为,所有现有实例都将在不做任何更改的情况下正常工作(100 +个 View ,至少500个TextBoxFor()s-不想手动对其进行编辑)。
我尝试了这段代码:(而且我需要为TextBoxFor的每个重载重复它,但是一旦根本问题解决了,那将是微不足道的)
namespace My.Helpers
{
public static class CustomTextBoxHelper
{
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool includeLengthIfAnnotated)
{
// implementation here
}
}
}
但是我在Html.TextBoxFor()的 View 中遇到编译器错误:“以下方法或属性之间的调用不明确”(当然)。有什么办法吗?
有没有一种替代方法可以使我更改Html.TextBoxFor的行为,从而不必更改已使用它的 View ?
最佳答案
您不能同时具有相同名称和签名的两个扩展方法。您可以将扩展方法放入自定义 namespace 中,并在Web.config中使用该 namespace 而不是默认 namespace (System.Web.Mvc.Html):
<pages>
<namespaces>
<!--<add namespace="System.Web.Mvc.Html"/>-->
<add namespace="YourCompany.Web.Mvc.Html"/>
</namespaces>
</pages>
但是如果这样做,您将丢失所有其他扩展方法,并且需要在自定义 namespace 中覆盖它们。