web-dev-qa-db-fra.com

Génération d'une URL d'action en JavaScript pour ASP.NET MVC

J'essaie de rediriger vers une autre page en appelant une action dans le contrôleur avec un paramètre spécifique. J'essaie d'utiliser cette ligne:

window.open('<%= Url.Action("Report", "Survey",
    new { id = ' + selectedRow + ' } ) %>');

Mais je ne pouvais pas le faire fonctionner; cela donne l'erreur suivante: 

CS1012: Too many characters in character literal.

Est-ce que je ne peux pas générer l'URL d'action qui était côté client? Ou dois-je passer un appel Ajax en fournissant le paramètre et récupérer l'URL nécessaire? Cela ne semble pas correct, mais je le veux si c'est le seul moyen. 

Y a-t-il une solution plus facile?

18
canxss

N'oubliez pas que tout ce qui est compris entre <% et%> est interprété comme un code C #, vous essayez donc d'évaluer la ligne suivante de C #:

Url.Action("Report", "Survey", new { id = ' + selectedRow + ' } )

C # pense que les guillemets simples entourent un littéral de caractère, d'où le message d'erreur que vous obtenez (les littéraux de caractère ne peuvent contenir qu'un seul caractère en C #)

Peut-être pourriez-vous générer l'URL une fois dans votre script de page - quelque part dans votre page HEAD, procédez comme suit:

var actionUrl =
    '<%= Url.Action("Report", "Survey", new { id = "PLACEHOLDER" } ) %>';

Cela vous donnera une chaîne Javascript contenant l'URL dont vous avez besoin, mais avec PLACEHOLDER au lieu du nombre. Puis configurez vos gestionnaires de clics comme suit:

window.open(actionUrl.replace('PLACEHOLDER', selectedRow));

en d'autres termes, lorsque le gestionnaire s'exécute, vous trouvez la valeur PLACEHOLDER dans votre URL précalculée et vous la remplacez par la ligne sélectionnée.

52
Dylan Beattie

Je déclare généralement une variable javascript dans la section qui contient la racine de mon site Web.

<%="<script type=\"text/javascript\">var rootPath = '"
    + Url.Content("~/") + "';</script>" %>

Pour résoudre votre problème, je ferais simplement

window.open(rootPath + "report/survey/" + selectedRow);
9
Jaco Pretorius

Pourrais tu 

window.open('/report/survey/' + selectedRow);

à la place, où la ligne sélectionnée est-elle l’id? Le routage devrait prendre cela très bien.

ou utilisez getJSON

Vous pourriez peut-être utiliser JSONResult à la place. Où que le window.open devrait être appeler une méthode à la place c'est-à-dire OpenSurveyWindow (id);

puis ajoutez des jquery similaires à ci-dessous

function OpenSurveyWindow(id){
      $.getJSON("/report/survey/" + id, null, function(data) {
          window.open(data);
     });
}

maintenant dans votre contrôleur

public JsonResult Survey(int id)
{
    return Json(GetMyUrlMethod(id));
}

Ce code n'est pas syntaxiquement parfait, mais quelque chose dans ce sens devrait fonctionner

3
Israfel

Juste si quelqu'un cherche toujours ça. L'action du contrôleur peut avoir des paramètres normaux ou un objet de modèle avec ces champs. MVC liera automatiquement la valeur. 

 var url = '@Url.Action("Action", "Controller")';
 $.post(url, {
      YearId: $("#YearId").val(),
      LeaveTypeId:  $("#LeaveTypeId").val()
 }, function (data) {
      //Do what u like with result
 });
1
Premson Baby

Vous ne pourrez pas faire cela, l'URL.Action étant un processus côté serveur, elle sera analysée avant que le côté sélectionné de clientside ne soit disponible. Israfel a la réponse que je suggérerais.

0
Pharabus

Le moyen le plus simple est de déclarer une variable javascript plutôt que de concatater la valeur de votre paramètre avec le lien.

  var url = '@Url.Action("Action","Controller")' + "/" + yourjavascriptvariable;
  <a href='" + url + "'> 
0
maxspan

Une façon de procéder qui pourrait être considérée comme plus propre consiste à utiliser les modèles T4MVC T4 . Vous pouvez ensuite écrire le code JavaScript dans votre vue comme ceci:

var reportUrl = '<%= Url.JavaScriptReplacableUrl(MVC.Survey.Report())%>';
reportUrl = myUrl.replace('{' + MVC.Survey.ReportParams.id + '}', selectedRow);

window.open(reportUrl);

L'avantage de ceci est que vous obtenez une vérification à la compilation pour les paramètres contrôleur, action et action.

0
Kenny Evitt

Une dernière chose à faire, pas si propre, je suppose:

var url = "@Url.RouteUrl(new { area = string.Empty, controller = "Survey", action = "Report" })";
var fullUrl = url  + '?id=' + selectedRow;
0
user2792022

Si selectedRow est une variable côté client, cela ne fonctionnera pas. Vous devez utiliser la mise en œuvre @Israfel pour créer un lien. Cela est dû au fait que le serveur est exécuté avant même que la variable client ne soit présente.

Si selectedRow est une variable côté serveur dans la vue, changez ceci:

window.open ('<% = Url.Action ("Rapport", "Enquête", nouveau {id = selectedRow})%>');

En effet, l'ID déduira le type de variable selectedRow ou vous pourrez convertir en chaîne avec la méthode ToString () (à condition que ce ne soit pas null).

0
Brian Mains