2010-01-06 19 views
18

Estoy intentando redirigir a otra página llamando a una acción en el controlador con un parámetro específico. Estoy tratando de usar esta línea:Generando una URL de acción en JavaScript para ASP.NET MVC

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

Pero no pude hacerlo funcionar; da el siguiente error:

CS1012: Too many characters in character literal.

¿No puedo generar la URL de acción que estaba en el lado del cliente? ¿O debo hacer una llamada Ajax proporcionando el parámetro y recuperar la URL necesaria? Esto no parece correcto, pero quiero hacerlo si es la única forma.

¿Existe una solución más fácil?

+0

¿Es un error de JS? ¿Qué se representa html-result? –

Respuesta

52

Recuerde que todo lo que entre <% y%> se interpreta como código C#, así que lo que en realidad está haciendo es tratando de evaluar la siguiente línea de C#:

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

C# piensa las comillas simples son alrededor de un carácter literal, de ahí el mensaje de error que está recibiendo (los literales de caracteres solo pueden contener un solo carácter en C#)

Quizás podría generar la URL una vez en su script de página, en algún lugar de su página HEAD, haga esto:

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

Eso le dará una cadena de Javascript que contiene la URL que necesita, pero con PLACEHOLDER en lugar del número. A continuación, configurar sus controladores de clic como:

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

es decir, cuando el controlador se ejecuta, se encuentra el valor de marcador de posición en su URL calculada de antemano, y reemplazarla con la fila seleccionada.

+0

Gracias por la respuesta. ¡Funcionó! – canxss

+0

No sé si te ayudará, pero esta pregunta/respuesta me ayudó. http://stackoverflow.com/questions/5093977/razor-mvc3-jquery-urlaction-partialviews/5094357#5094357 –

3

Podría hacerlo

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

lugar donde seleccionada fila que supongo que es el ID? La ruta debería recoger esto bien.

o utilizar getJSON

Tal vez usted podría utilizar JsonResult lugar. Dondequiera que el window.open deba llamarse un método, es decir, OpenSurveyWindow (id);

continuación, añadir un poco de jQuery similar a continuación

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

ahora en su controlador

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

Ese código isnt sintácticamente perfecta, pero algo en ese sentido deben trabajar

+0

Pero quiero que la Url.Action genere la url porque de esta manera también tengo que especificar los parámetros de raíz de la URL que pueden cambiar. – canxss

+0

Gracias por la respuesta. Funciona pero para obtener una ruta simple hacer una llamada ajax no me parece bien. Pero si no hubiera otra forma, lo haría de todos modos. – canxss

0

Usted no será capaz de haga esto, la URL. La acción es un proceso del lado del servidor, por lo que se analizará antes de que esté disponible el rizo seleccionado del cliente. Israfel tiene la respuesta que sugeriría.

0

Si selectedRow es una variable del lado del cliente, no funcionará. Debes usar la implementación de @Israfel para vincular. Esto se debe a que el servidor se ejecuta antes de que la variable del lado del cliente exista.

Si selectedRow es una variable del lado del servidor dentro de la vista, el cambio a esto:

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

Esto se debe a que el id deducirá el tipo de variable selectedRow, o puede convertir a cadena con el método ToString() (siempre que no sea nulo).

9

Normalmente declaro una variable javascript en la sección para mantener la raíz de mi sitio web.

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

para resolver su problema lo haría simplemente hacer

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

Simple y efectivo. En una página de afeitar que necesitaba utilizar \t ' ' – JabberwockyDecompiler

0

Una manera de hacer esto que podría considerarse más limpia implica el uso de la T4MVC T4 templates. A continuación, podría escribir el código JavaScript dentro de su vista como esta:

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

window.open(reportUrl); 

La ventaja de esto es que se llega en tiempo de compilación comprobación para el controlador, la acción y parámetro de acción.

0

Una cosa más que se puede hacer, no es tan limpia que supongo:

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

La forma más fácil es declarar una variable de JavaScript que concate el valor del parámetro en el enlace.

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

Solo si alguien todavía está buscando esto. La acción del controlador puede tener parámetros normales o un objeto modelo con estos campos. MVC vinculará el valus automáticamente.

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