-1

我在 MVC 中创建了一个系统,使用 NerdDinner 教程作为工作的基础。

一切正常,直到我使用单一动作方法,例如

这是 global.asax.cs

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

哪些路线到

http:localhost/Home/mysample

我只想创建具有多个动作的路线

http:localhost/<controller>/<action>/<params>
ex: localhost/mycontroller/myaction/details/myname

非常感谢任何帮助。

谢谢。

更新1:

我把这样的路由器写成

routes.MapRoute(
                "myname",                                              // Route name
                "{controller}/{action}/{details}/{myname}",                           // URL with parameters
                new { controller = "mycontroller", action = "myaction", details= "details", myname= "" }  // Parameter defaults
            );

并使用以下语法重试该值

String name=RouteData.Values["myname"].ToString();

它工作正常。

但即使网址称为

localhost/mycontroller/myaction/details

它被路由到该控制器并且错误被作为空引用抛出......

如何避免?

4

1 回答 1

1

您不能在一个 MVC 路由中定义多个操作。在 MVC 中,路由配置用于将您的控制器和操作映射到用户友好的路由,并且:

  1. 保持网址干净
  2. 保持 URL 可被最终用户发现
  3. 避免在 URL 中使用数据库 ID

了解默认路由配置:

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

Route 类的“routeTemplate”属性定义了 URL 匹配规则,用于评估路由规则是否适用于特定的传入请求。

Route 类的“defaults”属性定义了一个默认值字典,以在传入 URL 不包含指定的参数值之一的情况下使用。

默认路由会映射所有请求,因为它已经为 routeTemplate 中的每个属性定义了默认值,{} 表示该属性是可变的,如果您未在 URL 中为该参数提供值,则如果您提供它,它将尝试采用默认值。在默认路由中,它为控制器定义了默认值,操作和 id 参数是可选的。这意味着如果你有这样的路线:

.../帐号登录

它将带您进入帐户控制器,登录操作,并且因为您没有指定道具并且它被定义为可选它会起作用。

.../家

这也将起作用,它将带您进入Home contoller和mysample操作

当您定义自定义路线时,就像您所做的那样:

routes.MapRoute(
                "myname",                                              // Route name
                "{controller}/{action}/{details}/{myname}",                           // URL with parameters
                new { controller = "mycontroller", action = "myaction", details= "details", myname= "" }  // Parameter defaults
            );

您没有将 myname 指定为可选,也没有将其指定为您的路由,这意味着您的 URL:localhost/mycontroller/myaction/details不会由您的自定义路由 myname 处理。它将由默认路由处理。当您尝试在控制器中访问您的 myname 参数时,它不存在,您将收到空引用错误。如果要指定参数的默认值(如果 url 中不存在),则需要在控制器中执行此操作。例如:

public class MyController : Controller
    {
         public ActionResult MyAction(string details = "details", string myname = "") 
         {
                ...

并将您的自定义路线更改为:

 routes.MapRoute(
                    "myname",                                              // Route name
                    "{controller}/{action}/{details}/{myname}",                           // URL with parameters
                    new { controller = "mycontroller", action = "myaction", details= UrlParameter.Optional, myname= UrlParameter.Optional }  // Parameter defaults
                );

但是你可以只定义一个控制器和一个动作,其余的routeTemplate是参数。

您不能在一条路线中定义两个操作。这没有任何意义。

于 2013-11-08T10:30:25.720 回答