2009-10-15 37 views
1

我有一個ASP.NET MVC應用程序。在應用方面,我有不同的動作一堆類似結構的路線:.NET路由引擎中的一個錯誤?

/Admin/Addresses/{AddressId}/Delete 
/Admin/Phones/{PhoneId}/Delete 
/Admin/Notes/{NoteId}/Delete 
/Admin/Files/{FileId}/Delete 

其中沒有工作......我一直在檢查5個小時的路線和動作,我知道他們都是以他們應該的方式寫下來,但它仍然是所有這些。

有趣的是,下面的路線,這也是類似結構的工作就好了:

/Admin/Addresses/{Id}/{Type} 
/Admin/Phones/{Id}/{Type} 
/Admin/Notes/{Id}/{Type} 
/Admin/Files/{Id}/{Type} 

兩個集合之間的唯一區別是,刪除路由使用GET和應該返回JSON ,而其他人使用POST和重定向。

有沒有人碰到過這個?

編輯:這是一個更大的代碼示例,每個請求的評論。第一個代碼示例是唯一的工作路線(這可能是因爲它是使用指定的網址結構的路線列表中的第一個),第二個代碼示例是線路中的下一條路線,根本不工作...

Routes.MapRoute("Administration (Delete Employee)", "Administration/Employees/{EmployeeId}/Delete", new { 
      controller = "Administration", 
      action = "DeleteEmployee" 
     }); 

[AcceptVerbs(HttpVerbs.Get)] 
    public JsonResult DeleteEmployee(short EmployeeId) { 
     try { 
      db.DeleteEmployee(EmployeeId); 

      return Json(new IJsonStatus() { 
       Success = true 
      }); 
     } catch (Exception ex) { 
      Shared.LogWarning(ex); 

      return Json(new IJsonStatus() { 
       Success = false, 
       Exception = ex.Message 
      }); 
     }; 
    } 

和非工作路線:

Routes.MapRoute("Administration (Delete Address)", "Administration/Addresses/{AddressId}/Delete", new { 
      controller = "Administration", 
      action = "DeleteAddress" 
     }); 

[AcceptVerbs(HttpVerbs.Get)] 
    public JsonResult DeleteAddress(int AddressId) { 
     try { 
      db.DeleteAddress(AddressId); 

      return Json(new BaseResponse() { 
       Success = true 
      }); 
     } catch (Exception ex) { 
      Shared.LogWarning(ex); 

      return Json(new BaseResponse() { 
       Success = false, 
       Exception = ex.Message 
      }); 
     }; 
    } 
+1

顯示您的代碼! – ChaosPandion 2009-10-15 23:30:02

+1

@Alex:不要添加評論,編輯您的問題。 – 2009-10-15 23:43:50

+0

只是一個註釋:我希望你能理解以HTTP GET方式實現刪除功能的所有含義。這是一個巨大的風險,因爲網絡爬蟲可以在一個簡單的過程中輕鬆消除所有數據。如果可能(使用Ajax),刪除操作應該使用HTTP DELETE來完成。 – 2009-10-16 16:23:26

回答

1

大概可以看到整個路由映射的呼叫,而不只是一個片段是有用的。這些東西是非常非常非常依賴操作的順序。

二,查看MVC routing debugger。它有助於揭開很多路線神祕化問題的神祕面紗。

0

很多時候,HTTP POST用於請求刪除操作。您是否在使用[AcceptVerbs(HttpVerbs.Get)]裝飾的這些操作上使用POST?

0

嘗試映射它更像是這樣的:

RouteTable.Routes.Add(new Route(
    "Administration/Forums/{action}/{id}", 
    new RouteValueDictionary(new { controller = "Forums", action = "Index", id = "" }), 
    new MvcRouteHandler())); 

RouteTable.Routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = "" }); 
0

我增加了調試器和它匹配的兩條路線:

Administration/Notes/{Id}/{Type} <--POST 
Administration/Notes/{NoteId}/Delete <--GET 

所以,我認爲它匹配的,因爲標識在裏面,這實際上代表了兩種客戶編號或僱員的職位路線,因爲它是一個統一的根據類型區分的行爲。

但是,我希望第二條路線上的/刪除強制它成爲真正的路線,但我想它停在第一個匹配參數?