2011-07-19 55 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,與您目前的路線設置,沒有路線限制,你做得不對。 –

相關問題