2012-09-01 38 views
4

我试图让一个表格行作为链接到我的mvc网站中的另一个视图。而不是使用自动生成的表列表提供的标准“详细信息”链接,我想使用表格行作为链接到“详细信息”视图。所以不知何故,我需要将这一行作为链接工作。每个ROM都有一个唯一的ID,我需要将其传递给控制器​​方法。我已经尝试了不同的解决方案,但是当我按在桌子上一行指出发生......在MVC中使用javascript调用控制器方法

到目前为止,这是我:

<script type="text/javascript"> 
$(document).ready(function(){ 
    $('#customers tr').click(function() { 
     var id = $(this).attr('id'); 
     $.ajax({ 
      url: "Customer/Details" + id, 
      succes: function() { } 
     }); 
    }) 
}) 
</script> 

我控制器的方法:

public ActionResult Details(int id) 
{ 
    Customer model = new Customer(); 
    model = this.dbEntities.Customers.Where(c => c.Customer_ID == id).Single(); 
    return View(model); 
} 

Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
} 

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }  
    ); 

    routes.MapRoute(
     "CustomerDetails", 
     "Customer/Details/{id}", 
     new { controller = "Customer", action = "Details", id = "" } 
    ); 
} 

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    // Use LocalDB for Entity Framework by default 
    Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 

回答

5

这里是我会做什么:

<tr data-id='@SomeRazorDataId' class="MyAction">foo</tr> 

然后:

$(document).ready(function(){ 
    $('.MyAction').live("click",function() { 
     var id = $(this).attr('data-id'); 
     window.location = "Customer/Details/" + id; 
    }) 
}); 

如果您正在使用jQuery 1.7+,你应该使用on()方法,而不是live()方法。

祝你好运!

+0

谢谢:)通过简单地使用window.location =“Details /”+ id; – Christian

+0

太棒了!现在不要忘记用一个指针来设置行的样式:'.MyAction {cursor:pointer;}'。让我知道你是否需要进一步的帮助。 –

3

在您的代码中有排字错误;

success: 
//----^ 
+0

谢谢,但它仍然不能工作;) – Christian

2

几件事情:

  1. 添加了动作和参数之间的斜线/):url: "Customer/Details/" + id,否则,你会调用Action称为Details123,例如,其不存在;
  2. 请确保您有一个配置路线在您的Global.asax支持id,即Customer/Details/{id}
  3. 像@undefined说,回调的名称是success,不succes

Global.asax应该有下面几行内容:

routes.MapRoute(
    "CustomerDetails", 
    "Customer/Details/{id}", 
    new { controller = "Customer", action = "Details", id = ""} 
); 
+0

谢谢! 1.完成! 2.完成! 3.什么?如何? – Christian

+0

@ChristianThoressonDahl:你的Global.asax是什么样的? –

+0

我更新了global.asax – Christian

1

最近我有这种类型的情况,并选择使用AJAX辅助类:

 @Ajax.ActionLink("Details", "Details", 
     new 
     { 
      id = Model.Id 
     }, null) 

在这个例子中它会假设你想要一个链接说'细节',你已经在客户控制器中。

无论哪种方式,看看辅助类,如果你想要做的是从一个链接,就会触发一个控制器动作,给你更多的强类型在如何通过/处理id的值条款等

0

你试图调用的URL是无效:

“客户/详细信息” + ID,

相反,它应该是“客户/详细& ID =” + ID

(OR)

使用 '数据'

$阿贾克斯({ url:“Customer/Details”, data:{id:id}, succes:function(){} });

相关问题