将Javascript变量传递给MVC3中的路由值

本文关键字:路由 MVC3 Javascript 变量 | 更新日期: 2023-09-27 17:51:08

我想在@Url中传递一个javascript变量。Action方法作为路由参数。

我喜欢将screenmode javascript变量作为路由参数传递给我的action方法。

我有一个视图模型与ScreenMode enum属性,并基于它I应该在Ajax中调用一个操作。我还需要传递一个javascript变量作为route的参数。

这是我所尝试的,但得到了编译错误。

名称'screenMode'在当前上下文中不存在

  $("#role-detail-form").submit(function (e) {
    if ($(this).valid()) {
    var screenMode = 0;
    @{
     if (Model.ScreenMode == UI.ViewModel.ScreenMode.New)
     {
       <text> 
       screenMode =2; 
       </text>
     }
    }
    $.post('@Url.Action("SaveRoleDetail", new { mode=screenMode})', 
            $(this).serialize(), function (data) {
                $("#role-detail").html(data);
                $.validator.unobtrusive.parse($("#role-detail"));
            });
        }
        e.preventDefault();
    });

My Action is

 public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode)
    {
    }

将Javascript变量传递给MVC3中的路由值

您必须将其拆分并自己构建查询字符串,以便合并Javascript变量。

你需要这样的东西:

$.post('@(Url.Action("SaveRoleDetail"))?screenMode=' + screenMode)

EDIT:虽然可能是最佳实践,但您应该将ScreenMode变量存储在模型中,然后在视图中为它放置一个HiddenFor。然后,每当您在Javascript中更改值时,只需更新隐藏输入的值,这样您的操作方法只需要将视图模型作为参数。如果你在JavaScript中发布表单,你可以调用$("#form").serialize()在你的post调用中发送所有数据。

也可以创建一个占位符,然后替换它:

var url = '@Url.Action("GetOrderDetails", "Home", new { id = "js-id" })'
          .replace("js-id", encodeURIComponent(rowId)); 

如果你使用T4MVC和jQuery,你可以这样调用ActionResult:

在控制器中:

public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode)
{
}

在视图中:

    $.post("@Url.Action(MVC.Home.SaveRoleDetail())", { viewModel: param1, screenMode: param2) }, function (data) {
        //Do Work
    });

访问路由值(可能在html.HiddenFor中)。值从JavaScript和构建你的URL没有@Url.Action。使用URL发布