0

J'essaie d'utiliser URLHelp.RouteUrl avec une chaîne dynamique en javascript. Je veux de cette façon -ASP.NET MVC RouteUrl avec action dynamique

function MyFun(action, param){ 
    var strPass = "MyController/" + action + "?param1=" + param; 
    Windows.Location.href = "<%=Url.RouteUrl(" + strPass + ")%>"; 
} 

Il ne fonctionne pas. Ai-je manqué quelque chose? Avons-nous une alternative dans ASP.NET MVC pour travailler de la même manière?

Merci,

Informations complémentaires -

J'essaie la manière ci-dessus parce que j'ai un problème de ma demande - la page principale a "http://myserver/myapplicaiton/mycontroller/myaction" revenir lorsque j'utilise "Windows.Location.href ="MyController/MyAction". Mais la page suivante ayant contrôleur double est apparu "http://myserver/myapplication/mycontroller/mycontroller/myaction".
Qu'est-ce qui cause ce problème de routage?

Répondre

0

J'ai fini avec une fonction pour obtenir l'URL complète -

fonction fullurl() {

var app = "<%=HttpRuntime.AppDomainAppVirtualPath.ToString()%>"; 

if (app == "/") 
    app = ""; 

return location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '') + app; 

}

Et puis l'appeler de -

function MyFun(action, param){   
     Windows.Location =FullURL() + "/MyController/" + action + "?param1=" + param; 
    } 
2

Essayez ce code à la place

function MyFun(action, param){   
     Windows.Location.href ="/MyController/" + action + "?param1=" + param; 
    } 
+0

C'est ce que j'utilise. Mais cette façon ne peut pas résoudre correctement ma racine de site Web. Je veux un moyen similaire à URL.Content ("~ /") pour obtenir un chemin correct. – Don

+0

essayez d'utiliser "~/MyController /" + action + "? Param1 =" + param – Cris

+2

@Don, j'admire votre envie de suivre les meilleures pratiques, mais vous ne pouvez pas utiliser dynamiquement Url.Content. Toute syntaxe Razor est pré-rendue avant le lancement de JS. Mais, même si ce n'est pas la meilleure pratique, ne craignez pas d'utiliser un chemin de corde simple. Un comportement dynamique comme celui-ci nécessite un peu de flexion. –

3

Cela ne peut pas fonctionner. Razor syntaxe rend avant que la page html n'atteigne le navigateur. Javascript s'exécute après.

Donc, vous essayez de remplir l'étape 1 à l'étape 2.

function MyFun(action, param){   
     Windows.Location ="/MyController/" + action + "?param1=" + param; 
    } 
+0

@Don, j'ai regardé votre exemple, et vous utilisez "Windows.Location.href =" MyController/MyAction ".Ce n'est pas la même chose que" Windows.Location = "/ MyController/MyAction" Notez que l'ajout d'un ** **/** principal et la suppression ** ** href ** devrait conduire le framework MVC à utiliser la racine du site Web –

+0

Merci pour votre réponse. Cela n'a pas résolu mon problème. Il renvoie "http: // myserver/mycontroller/myaction" sans "/ myapplicaiton" après avoir été déployé sur un serveur. Cela fonctionne dans Visual Studio 2010 mais pas après le déploiement. – Don

+0

@Don, utilisez-vous des routes spéciales? Si oui, veuillez les inclure dans votre réponse. Sinon, je recommande d'utiliser une méthode d'action de redirection à laquelle vous passerez l'action et le contrôleur –

0

Vous ne pouvez pas ajouter dynamiquement le code de rasoir à une vue une fois le code quitte le serveur ... Razor est pas compilé sur le navigateur client .

Vous pouvez utiliser jQuery et faire une .ajax de $() appeler à un contrôleur/action qui a le seul but de vous retourner une url:

public ActionResult GenerateUrlFromRoutingEngine(string ControllerName, string ActionName, string RouteValues) 
{ 
    var ctx = new HttpContextWrapper(HttpContext.Current); 
    UrlHelper helper = new UrlHelper(
          new RequestContext(ctx, 
          RouteTable.Routes.GetRouteData(ctx)); 
    var returnUrl = helper.Action(ControllerName,ActionName, RouteValues); //TODO: transform RouteValues to RouteValuesDictionary 
    return Content(returnUrl); 
} 

Dans le rappel .ajax $, configurer Windows .Location.href = réponse; (Mettre ce javascript sur un fichier .cshtml de rasoir ou de trouver un moyen de passer dans l'URL intuitive.)

function MyFun(action, param){ 
    $.ajax({ 
      type: "POST", 
      url: "@{Html.RouteLink("GenerateUrlFromRoutingEngine", "MyController")}", 
      data: { ControllerName: 'MyController', ActionName: action, RouteValues: param }, 
      dataType: "text", 
      success: function(response) { Windows.Location.href = response; } 
      } 
} 
+0

en utilisant Ajax est certainement une bonne idée. Je me dépêche de finir d'utiliser javascript régulier. Je vais essayer votre chemin plus tard. Merci – Don

Questions connexes