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?
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.
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);
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
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
});
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.
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 + "'>
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.
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;
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).