Estou tentando escrever um auxiliar no Razor que se pareça com o seguinte:
@helper DoSomething<T, U>(Expression<Func<T, U>> expr) where T : class
Infelizmente, o analisador pensa que <T
é o início de um elemento HTML e acabo com um erro de sintaxe. É possível criar um helper com o Razor que seja um método genérico? Em caso afirmativo, qual é a sintaxe?
asp.net-mvc
generics
asp.net-mvc-3
razor
mkedobbs
fonte
fonte
static
, a menos que os detalhes de implementação o proíbam; a razão é que se poderia usar auxiliares de extensão genéricos :@helper Foo<T>(this T o) where T : IBar { }
Respostas:
Não, isso não é possível. Em vez disso, você poderia escrever um auxiliar HTML normal.
e depois:
ou se você está direcionando o modelo como primeiro argumento genérico:
que permitirá que você o invoque desta forma (assumindo, é claro, que sua visão seja fortemente tipada, mas isso é uma suposição segura porque todas as visualizações devem ser fortemente tipadas de qualquer maneira :-)):
fonte
Isso é possível fazer dentro de um arquivo auxiliar com a
@functions
sintaxe, mas se você quiser a legibilidade estilo navalha à qual está se referindo, também precisará chamar um auxiliar regular para fazer o ajuste e finalização do HTML.Observe que as funções em um arquivo Helper são estáticas, portanto, você ainda precisa passar a instância HtmlHelper da página se pretende usar seus métodos.
por exemplo, Views \ MyView.cshtml:
App_Code \ MyHelper.cshtml:
fonte
System.Web.WebPages.Html.HtmlHelper
vez deSystem.Web.Mvc.HtmlHelper
. Há uma excelente chance de que aWebPages
versão não seja adequada para você, uma vez que a maioria dos métodos de extensão são escritos contraSystem.Web.Mvc.HtmlHelper
. Além disso, não existe nenhumaUrl
propriedade eUrlHelper
requer umRequestContext
que não está disponível naWebPages
versão. No geral, você provavelmente terá que passar noMvc
HtmlHelper
.{MyMvcProject}\App_Code`. It doesn't work as advertised when you place it elsewhere. The error *Cannot access non-static method 'TheThingToDo' in static context* disappears when you move
MyHelper.cshtml` emApp_Code
.DoSomething
deve ser estático, para que você possa chamar@MyHelper.DoSomething(..)
em sua visualização. Se você torná-lo não estático, precisará criar uma instância deMyHelper
primeiro.Em todos os casos, o
TModel
será o mesmo (o modelo declarado para a visualização) e, no meu caso, oTValue
seria o mesmo, então pude declarar o tipo de argumento Expression:Se os campos do seu modelo forem todos
string
, você poderá substituirMyClass
porstring
.Pode não ser ruim definir dois ou três auxiliares com o
TValue
definido, mas se você tiver mais algum que geraria um código feio, eu realmente não encontrei uma boa solução. Eu tentei encapsular o@helper
de uma função que coloquei dentro do@functions {}
bloco, mas nunca consegui trabalhar nesse caminho.fonte
TModel
você provavelmente sabe com antecedência.se o seu principal problema é obter o valor do atributo name para vinculação usando a expressão lambda parece com o
@Html.TextBoxFor(x => x.MyPoperty)
, e se o seu componente tem tags html muito complexas e deve ser implementado no auxiliar de barbear, então por que não criar apenas um método de extensãoHtmlHelper<TModel>
para resolver o nome da ligação:seu auxiliar de barbear deve ser como de costume:
então aqui você pode usá-lo
fonte
@Htm.IdFor
mas precisa de um processo extra para convertê-lo em string (.ToHtmlString()
) onde o auxiliar exige string