2010-01-06 5 views
18

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:Génération d'une action URL en JavaScript pour ASP.NET MVC

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

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

CS1012: Too many characters in character literal.

Impossible de générer l'URL d'action c'était du côté du client? Ou dois-je faire un appel Ajax en fournissant le paramètre et récupérer l'URL nécessaire? Cela ne semble pas juste, mais je le veux si c'est le seul moyen.

Existe-t-il une solution plus simple?

+0

Est-ce une erreur JS? Qu'est-ce qui est rendu html-result? –

Répondre

52

Rappelez-vous que tout entre <% et%> est interprété comme le code C#, donc ce que vous êtes en train de faire est d'essayer d'évaluer la ligne suivante de C#:

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

C# pense que les guillemets simples sont entourant un caractère littéral, d'où le message d'erreur que vous obtenez (les littéraux de caractères 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, faites ceci:

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 numéro. Configurez ensuite vos gestionnaires de clic comme:

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

à savoir lorsque le gestionnaire exécute, vous trouvez la valeur PlaceHolder dans votre URL pré-calculée, et le remplacer par la ligne sélectionnée.

+0

Merci pour la réponse. Ça a marché! – canxss

+0

Je ne sais pas si ça va vous aider, mais cette question/réponse m'a aidé. http://stackoverflow.com/questions/5093977/razor-mvc3-jquery-urlaction-partialviews/5094357#5094357 –

3

Pouvez-vous faire

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

au lieu où la ligne sélectionnée je suppose est l'id? Le routage devrait ramasser cela bien.

ou utiliser getJSON

Peut-être que vous pouvez utiliser à la place JsonResult. Partout où le window.open devrait être appeler une méthode à la place, c'est-à-dire OpenSurveyWindow (id);

puis ajoutez un peu jquery semblable au-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 isnt syntaxiquement parfait, mais quelque chose le long de ces lignes devrait fonctionner

+0

Mais je veux que l'url soit générée par l'Url.Action car de cette façon j'ai aussi la possibilité de spécifier les paramètres root de l'url qui peuvent changer! – canxss

+0

Merci pour la réponse. Cela fonctionne mais pour obtenir un itinéraire simple, faire un appel ajax ne me semble pas correct. Mais s'il n'y avait pas d'autre moyen, je le ferais de toute façon. – canxss

0

Vous ne serez pas en mesure de Pour ce faire, l'URL.Action est un processus côté serveur, donc analysera avant que le client selectedRow soit disponible. Israfel a la réponse que je suggérerais.

0

Si selectedRow est une variable côté client, cela ne fonctionnera pas. Vous devez utiliser l'implémentation @Israfel pour créer un lien. Cela est dû au fait que le côté serveur s'exécute avant même que la variable côté client n'existe.

Si SelectedRow est une variable côté serveur dans la vue, le changement à ceci:

window.open (» <% = Url.Action ("Rapport", "Enquête", nouvelle {id = SelectedRow})%> '); Cela est dû au fait que l'ID inférera le type de variable selectedRow, ou que vous pourriez convertir en chaîne avec la méthode ToString() tant qu'elle n'est pas nulle).

9

Je déclare généralement une variable javascript dans la section pour contenir la racine de mon site web.

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

Pour résoudre votre problème, je voudrais simplement faire

window.open(rootPath + "report/survey/" + selectedRow); 
+0

Simple et efficace. Sur une page de rasoir je devais utiliser \t ' ' – JabberwockyDecompiler

0

Une façon de faire qui pourrait être considéré comme plus propre implique l'utilisation du T4MVC T4 templates. Vous pouvez alors é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 est que vous obtenez la compilation de vérification pour le contrôleur, l'action, et le paramètre d'action.

0

Une chose qui peut être fait, pas si propre, je suppose:

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

Le plus simple est de déclarer une variable javascript que concate votre valeur de paramètre sur le lien.

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

Juste si quelqu'un est toujours à la recherche de cela. L'action du contrôleur peut avoir des paramètres normaux ou un objet modèle avec ces champs. MVC liera le valus automatiquement.

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