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

Mur*_*san 5 c# asp.net-mvc asp.net-mvc-routing razor asp.net-mvc-3

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

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

我有一个带有ScreenMode枚举属性的视图模型,基于它我应该在Ajax中调用一个动作.我还需要传递一个javascript变量作为路由的参数.

这是我尝试并得到编译错误.

当前上下文中不存在名称"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();
    });
Run Code Online (Sandbox Code Playgroud)

我的行动是

 public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode)
    {
    }
Run Code Online (Sandbox Code Playgroud)

mat*_*mmo 6

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

这样的东西就是你需要的东西:

$.post('@(Url.Action("SaveRoleDetail"))?screenMode=' + screenMode)
Run Code Online (Sandbox Code Playgroud)

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


Vah*_*idN 5

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

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