jquery - ¿Cómo pasar valor dinámico en @ Url.Action?
asp.net-mvc-4 (3)
He escrito siguiendo jquery en mi vista parcial:
$.ajax({
type: "POST",
url: ''@Url.Action("PostActionName", "ControllerName")'',
data: { Id: "01" },
success: function(data)
{
if (data.success="true")
{
window.location = ''@Url.Action("GetActionName", "ControllerName")''
}
}
});
El nombre de la Acción y el nombre del Controlador no son fijos, están obligados a cambiar según la vista en la que se coloque esta vista parcial. Tengo funciones para recuperar la acción de invocación y los nombres de los controladores, pero no estoy seguro de cómo puedo pasarlos en @ Url.Action.
A continuación se muestran las funciones de Javascript para recuperar los nombres de acción y controlador:
function ControllerName() {
var pathComponents = window.location.pathname.split(''/'');
var controllerName;
if (pathComponents.length >= 2) {
if (pathComponents[0] != '''') {
controllerName = pathComponents[0];
}
else {
controllerName = pathComponents[1];
}
}
return controllerName;
}
function ActionName() {
var pathComponents = window.location.pathname.split(''/'');
var actionName;
if (pathComponents.length >= 2) {
if (pathComponents[0] != '''') {
actionName = pathComponents[1];
}
else {
actionName = pathComponents[2];
}
}
return actionName;
}
Tengo funciones para recuperar la acción de invocación y los nombres de los controladores, pero no estoy seguro de cómo puedo pasarlos en @ Url.Action
Bueno, podrías llamar a esas funciones. Por ejemplo, si son métodos de extensión a la clase UrlHelper:
window.location = ''@Url.Action(Url.MyFunction1(), Url.MyFunction2())''
o si son solo funciones estáticas:
window.location = ''@Url.Action(SomeClass.MyFunction1(), SomeClass.MyFunction2())''
Si, por otra parte, los valores que deben pasarse se conocen solo en el cliente, puede hacer lo siguiente:
var param = ''some dynamic value known on the client'';
var url = ''@Url.Action("SomeAction", "SomeController", new { someParam = "__param__" })'';
window.location.href = url.replace(''__param__'', encodeURIComponent(param));
ACTUALIZAR:
Parece que solo estás tratando de obtener el controlador actual y la acción que podría lograrse así:
@{
string currentAction = Html.ViewContext.RouteData.GetRequiredString("action");
string currentController = Html.ViewContext.RouteData.GetRequiredString("controller");
}
y entonces:
window.location.href = ''@Url.Action(currentAction, currentController)'';
¿Has intentado algo como ésto? No lo he intentado yo mismo, pero debería funcionar.
var dataToSend = "01";
var url = ''/controllerName/actionName/'' + dataToSend;
var actionName = ActionName();
var controllerName = ControllerName();
url.replace("actionName",actionName);
url.replace("controllerName",controllerName);
window.location = url;
function functionName(var1, var2) {var link = ''@Url.Action("MethodName", "Controller", new { id = "-1", name = "-2" })'';
link = link.replace("-1", var1);
link = link.replace("-2", var2);}
antes, reemplace:
html += "<a class=''k-button k-button-icontext k-primary'' href=''" + link + "''><i class=''fa fa-download''></i> Name Button</a>"