Eu estava tentando criar um auxiliar declarativo Razor na minha pasta App_Code para um projeto MVC 3 RTM.
O problema que encontrei foi que as extensões MVC HtmlHelper, como o ActionLink, não estão disponíveis. Isso ocorre porque os auxiliares compilados derivam System.Web.WebPages.HelperPage
e, embora exponha uma Html
propriedade, é do tipo System.Web.WebPages.HtmlHelper
e não System.Web.Mvc.HtmlHelper
.
Um exemplo do tipo de erro que eu estava recebendo é:
'System.Web.Mvc.HtmlHelper' não contém uma definição para 'ActionLink' e nenhum método de extensão 'ActionLink' que aceita um primeiro argumento do tipo 'System.Web.Mvc.HtmlHelper' pode ser encontrado (você está perdendo uma diretiva de uso ou uma referência de montagem?)
Minha única solução foi criar meu próprio HelperPage e substituir a propriedade Html:
using System.Web.WebPages;
public class HelperPage : System.Web.WebPages.HelperPage
{
// Workaround - exposes the MVC HtmlHelper instead of the normal helper
public static new HtmlHelper Html
{
get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
}
}
Eu tenho que escrever o seguinte no topo de todo ajudante:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
É para ser tão difícil no MVC 3, ou estou fazendo algo errado?
fonte
Respostas:
Veja a
Marcind
resposta desta pergunta. O que você está enfrentando é uma limitação de colocar visualizações declarativas naApp_Code
pasta.fonte
Criei um método de extensão para o auxiliar de páginas da Web, para que eu possa acessar o auxiliar de página.
fonte
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
e@using System.Web.Mvc.Html
em arquivo de ajudantes cshtml dentro App_CodeHtmlHelper
classe para fins de codificação, eu encontrei uma maneira ainda mais rápida de fazer isso é através da classe estáticaMicrosoft.Security.Application.Encoder
como em:Encoder.HtmlAttributeEncode(value)
Omar tem a resposta certa aqui, mas eu queria acrescentar algo (sinta-se à vontade para marcar a resposta de Omar como a resposta).
Estávamos cientes disso na v1 e não conseguimos uma ótima correção no produto, mas David Ebbo (um arquiteto da equipe do ASP.Net) publicou uma amostra de um gerador de código do Visual Studio que é basicamente a primeira exploração de o tipo de idéias que estamos buscando para fazer isso funcionar corretamente: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx
Experimente e veja o que você pensa! Deixe David saber se você tem comentários postando em seu blog.
fonte
Semelhante à resposta @ Jakes:
Uso:
Fonte: Dino Esposito - Programação Microsoft ASP.NET MVC
fonte
Uma solução alternativa:
Adicione isso em cima do seu arquivo de barbeador:
então chame assim:
fonte
Minha abordagem para isso é simplesmente passar a página como um parâmetro para o método auxiliar. Então, no seu exemplo, seria:
Em sua visão do Razor, onde você precisa, chame assim:
Fazer isso imediatamente dá acesso a propriedades da página como
Html
ouUrl
que você normalmente possui (e por meio disso asHtmlHelper
extensões).Como um benefício adicional (se você precisar disso), você também terá acesso a propriedades da instância, como as da página
ViewData
.fonte
Para o benefício dos pesquisadores, recebi o mesmo erro ao criar visualizações MVC como parte de uma biblioteca de classes (para reutilização de componentes). A solução, parcialmente mencionada acima, foi adicionar as seguintes instruções usando na parte superior do arquivo .cshtml:
Nenhum trabalho adicional é necessário.
fonte
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
pairando@using System.Web.Mvc
. Alguma ideia?Sei que há alguns problemas de inteligência com o MVC 3. Acho que os ajudantes ainda funcionarão se você tiver o espaço para nome definido no web.config.
O MVC 3 RTM acaba de ser lançado. Você está usando este ou um beta?
fonte
Parece que o ASP.NET MVC corrigiu esse problema no VS 2013. Consulte esta postagem http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- htmlhelper-ht
fonte
@using System.Web.Mvc.Html
a parte superior do arquivo cshtml no App_Code, mas escrever @Html .... não revela nenhum dos métodos de extensão, comoEditorFor
. É ridículo que isso não funcione após 2 lançamentos importantes e postagens no blog que alegam que foi implementado. Não é. De fato, os métodos de extensão não podem funcionar, porque têm como alvo a classe System.Web.Mvc.HtmlHelper, não a classe System.Web.WebPages.HtmlHelper, que é exposta pela classe System.Web.WebPages.HelperPage.