2013-01-09 63 views
5

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

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

我有一个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(); 
    }); 

我的行为是

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

回答

6

你不得不拆分,并建立查询字符串自己,为了加入Javascript变量。

像这样的东西是你所需要的:

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

编辑:虽然可能是最好的做法,您应该存储在模型中ScreenMode变量,然后把HiddenFor在你为它视图。然后,只要更改Javascript中的值,只需更新隐藏输入的值即可,这样您的操作方法只需将视图模型作为参数即可。如果您使用JavaScript发布表单,并且您可以致电$("#form").serialize()在您的邮寄呼叫中发回所有数据。

+0

我可以在post ajax方法中传递这个查询字符串吗? url的外观如何? screenMode会成为发布参数或查询字符串的一部分? –

+0

更好的是,您可以将ScreenMode放入您的模型中,在视图中放置一个hiddenFor,然后如果您想要在Javascript中更改它的值,则只需更新隐藏输入的值,然后完成后, $(“#form”)。serialize();这样你的动作方法只需要视图模型作为参数:) – mattytommo

+0

是的,你是正确的。我现在使用隐藏字段并使用Javascript进行更新。你可以请添加这个隐藏的字段信息作为你的答案的一部分。所以它会很容易看到,对其他人也有帮助:) –

0

如果使用T4MVC和jQuery,你可以调用的ActionResult执行以下操作:

在控制器:

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

在视图:

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

     //Do Work 

    }); 
+1

如果为T4MVC和jQuery添加链接将会很有帮助。所以人们可以从这里轻松导航。谢谢 –

+0

对不起,我错过了链接。两者都可以作为Nuget包使用。 T4MVc可以在这里找到(http:// t4mvc。codeplex.com/)和jQuery在这里(http://jquery.com/)希望这会有所帮助。 – lopezbertoni

4

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

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

我更喜欢这种方法 – Alireza