Я хочу переопределить HTML. TextBoxFor () с моим собственным помощником, который имеет ту же самую подпись (но другое пространство имен, конечно) - действительно ли это возможно, и если так, как?
Причина этого состоит в том, что я имею 100 + представления в уже существующем приложении, и я хочу изменить поведение TextBoxFor так, чтобы это произвело атрибут maxLength=n, если свойство имеет [StringLength (n)] аннотация.
Код для того, чтобы автоматически произвести maxlength=n находится в этом вопросе: атрибут maxlength текстового поля от DataAnnotations StringLength у Asp. Сетевой MVC. Но моим вопросом не является дубликат - я пытаюсь создать более универсальное решение: куда DataAnnotaion течет в HTML автоматически без любой потребности в дополнительном коде человека, пишущего представление.
В вопросе, на который ссылаются необходимо изменить каждый HTML. TexBoxFor к HTML. CustomTextBoxFor. Я должен сделать это так, чтобы существующие TextBoxFor () не должны были быть изменены - следовательно создание помощника с той же подписью: измените поведение вспомогательного метода, и все существующие экземпляры будут просто работать без любых изменений (100 + представления, по крайней мере 500 TextBoxFor () s - не хотят вручную редактировать это).
Я попробовал этот код: (И я должен повторить его для каждой перегрузки TextBoxFor, но после того как корневая проблема решена, который будет тривиален),
namespace My.Helpers
{
public static class CustomTextBoxHelper
{
public static MvcHtmlString TextBoxFor(this HtmlHelper htmlHelper, Expression> expression, object htmlAttributes, bool includeLengthIfAnnotated)
{
// implementation here
}
}
}
Но я получаю ошибку компилятора в представлении о HTML. TextBoxFor (): "Вызов неоднозначен между следующими методами или свойствами" (конечно). Там какой-либо путь состоит в том, чтобы сделать это?
Есть ли альтернативный подход, который позволил бы мне изменять поведение HTML. TextBoxFor, так, чтобы представления, которые уже используют его, не должны были быть изменены?
Вы можете решить эту проблему. с шаблоном редактора и настраиваемым ModelMetadataProvider. (Извините за то, что не предоставили дополнительную информацию, хотя это вполне можно использовать в Google, и я надеюсь, что это приведет вас в правильном направлении.)
Вы не можете иметь два метода расширения с одинаковым именем и одинаковой сигнатурой одновременно. Вы можете поместить метод расширения в пользовательское пространство имен и использовать это пространство имен вместо стандартного (System.Web.Mvc.Html) в вашем web.config:
<pages>
<namespaces>
<!--<add namespace="System.Web.Mvc.Html"/>-->
<add namespace="YourCompany.Web.Mvc.Html"/>
</namespaces>
</pages>
но если вы это сделаете, вы потеряете все другие методы расширения, и вам придется переопределить их в вашем пользовательском пространстве имен.