Como você solicita arquivos .html estáticos na pasta ~ / Views na ASP.NET MVC?

92

Desejo poder solicitar .htmlarquivos estáticos que estão localizados na ~/Viewspasta. De acordo com a documentação, o sistema de roteamento verifica se um URL corresponde a um arquivo de disco antes de avaliar as rotas do aplicativo.

Mas quando eu solicito o arquivo, 404surge um erro.

Meu arquivo está localizado na pasta ~ / Views. O URL é:http://[localhost]/Views/HtmlPage1.html

O que eu perdi?

alex.mironov
fonte

Respostas:

111

Desejo poder solicitar arquivos .html estáticos que estão localizados na pasta '~ / Views'.

Você não pode. Há um arquivo web.config nesta pasta que proíbe explicitamente o acesso a qualquer arquivo a partir dela. Se você deseja acessar os arquivos do cliente, esses arquivos não devem ser colocados na Viewspasta que tem um significado especial na ASP.NET MVC.

Você pode ter uma ~/Staticpasta onde colocar seus arquivos HTML. E então acesse assim:

http://example.com/yourapplicationname/static/foo.html
Darin Dimitrov
fonte
4
Ou, em vez de nomear sua pasta como 'estática', você pode imitar a estrutura de nomes do controlador que se encontra dentro da pasta Views .. então o URL tem a mesma 'aparência'. Por exemplo, uma vez que você não pode colocar sua planilha Edit.html em Views / Order / Edit.html - coloque-a em ~ / Order / Edit.html
bkwdesign
2
Isso agora mudou com o último ASP.NET (vNext), onde você pode registrar o provedor estático para arquivos html, mas também pode rotear o caminho MVC normal. Só joguei rapidamente com ele, mas foi o que fiz com um projeto de teste. Executando através do Kestrel no Linux ... mas o IIS deve ser o mesmo, suponho.
Piotr Kula
1
@bkwdesign Tenho certeza de que sua configuração controlada imitando a estrutura de pastas bagunçou o manipulador padrão do meu controlador e o tornou inacessível. Portanto, teste esta situação.
Hunter-Orionnoir
78

Para permitir arquivos como js e html na pasta Views, edite o web.config na pasta views:

<system.webServer>
<handlers>
  <add name="JavaScriptHandler" path="*.js" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />      
  <add name="HtmlScriptHandler" path="*.html" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>

cs3x
fonte
1
Tive que remover a linha "routes.RouteExistingFiles = true;" em RouteConfig.RegisterRoutes para que isso funcione
Sam Sippe
Embora a resposta marcada contenha informações úteis, esta é a melhor resposta. Testado e trabalhando no meu projeto atual.
A. Murray,
1
E os arquivos css?
Leandro
A resposta de @Darin Dimitrov oferece uma solução alternativa, mas deve ser marcada como a resposta
Kunal
31

Desejo poder solicitar arquivos .html estáticos que estão localizados na pasta ~ / Views.

Bem, você pode. A resposta marcada não é totalmente correta, embora forneça uma solução.

O raciocínio da resposta marcada está correto, é web.config (configuração BlockViewHandler para ser específico) na pasta Views que impede que os arquivos sejam acessados ​​diretamente. Ele existe para proteger as visualizações no Asp.Net MVC. Mas se você fez uma pergunta sobre como servir esses arquivos diretamente, provavelmente tem um motivo válido para fazê-lo, como usar visualizações parciais do AngularJS (como no nosso caso), onde não queremos duplicar a pasta de visualizações com nomes estranhos.

Portanto, aqui está um ajuste muito simples que você pode fazer no arquivo web.config encontrado na pasta Views, sem comprometer a segurança de suas views mvc do asp.net. Isso protegerá os arquivos .cshtml como de costume, mas deixará seus arquivos .html em paz.

Mude isso

<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"    type="System.Web.HttpNotFoundHandler" />

--para--

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Vikas
fonte
3
Isso ainda pode ser perigoso com outros arquivos, como arquivos .aspx ou .ascx ou de mecanismos de exibição de terceiros. É muito melhor colocar na lista de permissões de acordo com a resposta do cs3x.
pwdst
1
@pwdst: Se você estiver usando uma mistura de visualizações do lado do servidor, sim, colocar tipos individuais na lista de permissões pode ser melhor. Queremos apenas proteger os arquivos .cshtml, então usamos isso porque é um pouco menos prolixo.
Vikas
14

Outra opção alternativa é inserir um método de ação em qualquer um dos controladores desejados para servir o arquivo html

public ActionResult MyHtml()
{
    var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html");
    return result;
}

Acesse o html como http: // yoursite / controller / MyHtml . Você pode estender este método de ação para aceitar o nome do arquivo html como parâmetro do método / querystrign e renderizar o arquivo em tempo de execução, por exemplo, algo assim.

 public ActionResult MyHtml(string htmlPageName)
 {
      var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html");
      return result;
 }
Venkatesh Muniyandi
fonte
0

Se você está planejando usar a pasta de visualização interna, as respostas acima devem ser as melhores, mas essa resposta pode ser útil para usuários que estão migrando para o asp.net mvc core. Colocar arquivos em wwwroot em vez de na pasta de visualizações deve fazer com que suas páginas html acessem facilmente como localhost / myfile.html

Kurkula
fonte