创建Url.Action调用时如何引用局部变量?

时间:2011-05-27 12:57:03

标签: javascript asp.net-mvc asp.net-mvc-3 jqgrid

Backstory:要为我在ASP.NET MVC 3页面上显示的jqGrid指定正确的路由,我会这样做:

$('#jqgFlavors').jqGrid({
   url: '@Url.Action("FlavorData", "IceCream")',
etc...

这将产生正确的路由,无论是在本地运行Visual Studio(在"http://localhost:90125/IceCream"之类的地方运行,还是在部署的网站上运行的地方,如"http://thehostsite/mydeployedsitename/IceCream"

大。现在我遇到的问题是我使用网格中的onSelectRow根据所选行的flavor id值来执行主/详细信息。首先,我尝试这样做才能使路线正确:

onSelectRow: function(theRow){
   $('#flavorDetails').load('@Url.Action("Details","IceCream", new {id = 42)})');
}

这样我就可以在Details控制器的IceCream操作中将值42作为'id'参数传递。这工作正常,但当然我不想硬编码值42,而是从网格本身拉出风味ID。所以我试图引用flavorID但似乎无法使语法正确:

onSelectRow: function(theRow){
   var grid = jQuery('#jqgFlavors');
   var flavorID = grid.jqGrid('getCell', theRow, 'FlavorID');
   $('#flavorDetails').load('@Url.Action("Details","IceCream", new {id = flavorID)})');
}

我确信你会得到我要去的东西 - 引用我从网格中提取的flavorID值。但我得到的是编译错误:

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

我怀疑这很简单。如何正确引用该变量?

1 个答案:

答案 0 :(得分:10)

您可以使用.load()方法的第二个参数,它允许您传递其他参数:

var flavorID = grid.jqGrid('getCell', theRow, 'FlavorID');
$('#flavorDetails').load('@Url.Action("Details", "IceCream")', { id: flavorID }); 

这可能会使用以下网址:/IceCream/Details?id=123而不是您想要的/IceCream/Details/123,因为javascript对您的路线一无所知,但为什么要关心?它仍将正确映射到控制器操作:

public ActionResult Details(int id)
{
    ...
}

但是,如果你真的肛门关于网址并且坚持使用第一种类型的网址我会看到人们在做以下事情:

var flavorID = grid.jqGrid('getCell', theRow, 'FlavorID');
var url = '@Url.Action("Details", "IceCream", new { id = "_TOREPLACE_" })';
url = url.replace('_TOREPLACE_', flavorID);
$('#flavorDetails').load(url); 

就我个人而言,我不会这样做,只是为记录提供它。