Chamada do Ajax Para o Problema de Url do Controlador MVC

Eu olhei para as perguntas jQuery / MVC postadas anteriormente e não encontrei uma resposta viável.

Eu tenho o seguinte código JavaScript:

$.ajax({ type: "POST", url: '@Url.Action("Search","Controller")', data: "{queryString:'" + searchVal + "'}", contentType: "application/json; charset=utf-8", dataType: "html", success: function (data) { alert("here" + data.d.toString()); } }); 

Ao chamar o Url, o post se parece com:

 NetworkError: 500 Internal Server Error -  

Alguém poderia me explicar por que ele retorna assim (a lógica por trás disso) e me oferecer uma solução válida? Desde já, obrigado!
PS: Informações Adicionais:% 22 é a Referência de Codificação de URL para o caractere <>

Para que isso funcione, o Javascript deve ser colocado dentro de uma visão Razor para que a linha

 @Url.Action("Action","Controller") 

é analisado por Razor e o valor real é substituído.

Se você não quiser mover o seu Javascript para o seu View, você pode criar um object de configuração na visualização e, em seguida, fazer referência a ele a partir do seu arquivo Javascript.

por exemplo

 var MyAppUrlSettings = { MyUsefulUrl : '@Url.Action("Action","Controller")' } 

e no seu arquivo .js

 $.ajax({ type: "POST", url: MyAppUrlSettings.MyUsefulUrl, data: "{queryString:'" + searchVal + "'}", contentType: "application/json; charset=utf-8", dataType: "html", success: function (data) { alert("here" + data.d.toString()); }); 

ou, alternativamente, olhar para alavancar os methods Ajax embutidos no framework dentro do HtmlHelpers, que permitem que você alcance o mesmo sem “poluir” o código do Views com o JS.

você tem um erro de tipo no exemplo de código. Você esquece o cachecol após o success

 $.ajax({ type: "POST", url: '@Url.Action("Search","Controller")', data: "{queryString:'" + searchVal + "'}", contentType: "application/json; charset=utf-8", dataType: "html", success: function (data) { alert("here" + data.d.toString()); } }) 

;

Uma boa maneira de fazer isso sem ter a visão envolvida pode ser:

 $.ajax({ type: "POST", url: '/Controller/Search', data: { queryString: searchVal }, success: function (data) { alert("here" + data.d.toString()); } }); 

Isso tentará postar no URL:

http: // domain / Controller / Search (que é o URL correto para a ação que você deseja usar)”

A partir da resposta de Rob , atualmente estou usando a seguinte syntax. Como a pergunta recebeu muita atenção, decidi compartilhar com você:

 var requrl = '@Url.Action("Action", "Controller", null, Request.Url.Scheme, null)'; $.ajax({ type: "POST", url: requrl, data: "{queryString:'" + searchVal + "'}", contentType: "application/json; charset=utf-8", dataType: "html", success: function (data) { alert("here" + data.d.toString()); } }); 

a partir da resposta de mihai-labo , por que não ignorar declarando a variável requrl completamente e colocar o url gerando o código diretamente na frente de “url:”, como:

  $.ajax({ type: "POST", url: '@Url.Action("Action", "Controller", null, Request.Url.Scheme, null)', data: "{queryString:'" + searchVal + "'}", contentType: "application/json; charset=utf-8", dataType: "html", success: function (data) { alert("here" + data.d.toString()); } }); 

Maneira simples de acessar o URL Tente este código

  $.ajax({ type: "POST", url: '/Controller/Search', data: "{queryString:'" + searchVal + "'}", contentType: "application/json; charset=utf-8", dataType: "html", success: function (data) { alert("here" + data.d.toString()); });