当两个不同的URL映射到单个控制器操作时,在视图中删除对URL的直接引用?

时间:2010-10-13 13:33:13

标签: asp.net-mvc

基本上我正在寻找最佳方法,当两个不同的URL调用相同的控制器操作时,无需对视图中的任何实际URL进行硬编码。如下所示,两个路由定义了不同的URL,一个用于创建新客户,另一个用于编辑现有客户。在控制器操作中,它通过检查AccountNumber的值来确定要执行的操作 - 如果未提供(null),则它知道它正在创建新客户。

routes.MapRoute(
    "Customer_Edit",
    "Customer/Edit/{CustNum}",
    new { controller = "Customer", action = "Edit", AccountNumber = "{CustNum}" }
);

routes.MapRoute(
    "Customer_Create",
    "Customer/Create",
    new { controller = "Customer", action = "Edit" }
);

此方法的缺点是您无法在视图中使用Url.Action(...)来确定URL,因为有两个不同的URL映射到控制器操作。我原本希望调用Url.Action(...)来确定提供的“RouteValues”使用哪个,但它似乎只是使用定义的第一个匹配路径。所以在这种情况下,如果你打电话

Url.Action("Edit", "Customer", new { CustNum = 2 })

您可以按照预期获得“Customer / Edit / 2”,但如果您致电

Url.Action("Edit", "Customer")

视图输出URL“Customer / Edit / {CustNum}”。

是否仍然使用此配置,您不需要将URL硬编码到视图中?或者,在创建新客户时采用单独的操作以及编辑客户的其他操作被认为是更好的做法,因此您最终得到以下内容

public class CustomerController : Controller
{
     public ActionResult Create()
     { return CreateOrEdit(null); }

     public ActionResult Edit(int custNum)
     { return CreateOrEdit(custNum); }

     private ActionResult CreateOrEdit(int? custNum)
     {....}
}

1 个答案:

答案 0 :(得分:2)

改为使用Url.RouteUrl并指定所需的路线。除了实际工作之外,RouteUrlAction快10 *。