Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Inlcuindo tag script na View e trabalhando com JS externo

Nessa aula, percebi duas coisas que não tenho costume de ver.

A 1º coisa é que no código abaixo:

<script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
    function decrementa(produtoId) {
        var url = "@Url.Action("DecrementaQuantidade", "Produto")";
        $.post(url, {id : produtoId}, atualiza);
    }

    function atualiza(data) {
        $("#quantidade" + data.Id).html(data.Quantidade);
    }
</script>

Essa inclusão de script é adicionada na View de Produto. Fica um pouco estranho incluir um script JS dentro do HTML dessa forma por que após a inclusão desse script, ainda há código HTML para renderizar após a chamada dessa view. É correto fazer dessa forma? Pelo o que eu sei, inclusões de scripts sempre devem ser a última coisa a ser incluída (logo após a tag body).

A 2º coisa é que o JS é trabalhado dentro da View Index. É sempre interessante criar arquivos JS externos para trabalhar com os eventos, objetos do jQuery etc. Se por ventura eu quisesse tirar o onclick, como eu pegaria o id desse produto se dentro do JS eu não tenho gerência sobre o código do Razor e nem do C#. Isso também se aplicaria á variável Url que monta a URL da requisição.

2 respostas
solução!

Leonardo, você tem razão sobre o posicionamento dos scripts.

Como inserir scripts específicos em nossas views que usam layout pages (isto é, só possuem o HTML relativo aquela view) ao mesmo tempo que controlamos o posicionamento dos scripts colocando-os antes do fechamento da tag body?

Uma solução que usamos no mundo AspNet é o método RenderSection() na página de layout.

Um exemplo. Seja a layout page resumida abaixo:

<html>
  <body>
    <main>
        @RenderBody()
    </main>
    @RenderSection("Scripts", false)
  </body>
</html>

Repare que declaramos uma seção chamada Scripts que fica logo antes do fechamento de body. Também indicamos que ela não é obrigatória.

Daí nas views que precisam declarar scripts fazemos:

<!--
html específico da view que será injetado quando RenderBody for chamado...
-->
@section Scripts {
<scripts>
</scripts>
}

A seção Scripts será injetada quando RenderSection('"Scripts", false) for chamada na layout page, fazendo com que todos os scripts fiquem posicionados conforme a boa prática.

Espero que tenha ajudado!

Obrigado pela ajuda Daniel.