2011-07-19 53 views
0

如何在我的区域注册中区分这两条路线?为什么我的表单没有发布到正确的控制器操作?

这些都是在该区域注册的最后2点的路由。

第一条路线的视图被加载时是。工作正常。

第一个路由加载,然后才能发布到相同的控制器,但不同的操作方式。

我从来没有从控制器确定。由于路由问题,它可能不会触及控制器。

我缺少什么?

context.MapRoute(
     "Load", 
     "app/respond/{Id}", 
     new { controller = "Controller1", action = "Index" } 
    ); 

    context.MapRoute(
     "Update", 
     "app/respond/{action}", 
     new { controller = "Controller1", action = "Update" } 
    ); 

这是形式的外观:

@using (Html.BeginForm("Update", "Respond", FormMethod.Post, new { id = "frmUpdate" })) 
{ 
    //all form fields go here 
} 

这是张贴是如何完成的:

$('#frmUpdate').submit(function() { 
    //verify all field values 

    $.ajax({ 
     url: this.action, 
     type: this.method, 
     data: $(this).serialize(), 
     success: function (result) { 
      if (result.s == 'OK') 
       alert("Success! Response updated"); 
      else 
       alert("Sorry! Update failed.");//this is what I get 
     } 
    }); 

    return false; 
}); 

我的控制器:

[HttpPost] 
public ActionResult Update(MyModel model) 
{ 
    return Json(new { s = "OK", m = "Hi from controller" }); 
} 

回答

1

你不能区分这两条路线,因为它们绝对符合t他相同的网址模式app/respond/something。您没有对something设置任何限制,因此第一条路线将始终匹配。

如果你想拥有路由系统能够区分的,你需要使用一个约束的任何机会,例如让我们说,一个{id}只能包含数字:

context.MapRoute(
    "Load", 
    "app/respond/{id}", 
    new { controller = "Controller1", action = "Index" }, 
    new { id = @"[0-9]+" } 
); 

context.MapRoute(
    "Update", 
    "app/respond/{action}", 
    new { controller = "Controller1", action = "Update" } 
); 

现在,当你要求app/respond/123索引操作将被调用,当您调用app/respond/FooBar时,将调用FooBar操作。如果您请求app/respond,则会调用Update操作。

+0

在我的情况下,两种情况下都有完全相同的网址,但我有不同的操作值。我无法在id上添加约束,因为第二个路由也具有相同的id,因为它是相同的url - 所有这些都是因为我在用户提交表单后将用户保留在同一页面上。我只是显示用户结果异步的方式。 – kheya

+0

我加载一个获得提交的表单。提交后,我做了一些数据库操作,然后想要将结果废弃给用户。这是使用jquery完成异步。加载操作与更新操作不同。我做对了吗? – kheya

+0

@Projapati,与您目前的路线设置,没有路线限制,你做得不对。 –

相关问题