C# MVC Uri参数为空

C# MVC Uri参数为空,c#,asp.net-mvc,C#,Asp.net Mvc,当试图将一个参数传递给一个简单的控制器时,我收到的参数总是空的 控制器 public class GetOrgController : Controller { private DirectoryEntities de; public getOrgController() { de = new DirectoryEntities(); } // GET: getOrg public ActionResult Index(strin

当试图将一个参数传递给一个简单的控制器时,我收到的参数总是空的

控制器

public class GetOrgController : Controller
{
    private DirectoryEntities de;

    public getOrgController()
    {
        de = new DirectoryEntities();
    }
    // GET: getOrg
    public ActionResult Index(string district)
    {
        getorg_Result org = de.getorg(district).FirstOrDefault();
        return View(org);
    }
}
当我尝试使用参数
localhost:660366/GetOrg/Index/D123
导航到该url时,地区变量总是
null

我想它可能需要使用默认的
RouteConfig
。当我把一个新值放在默认路由配置之前时,它起作用了!但是现在,每当我尝试启动应用程序时,它都会首先进入
GetOrgController
。当我想要一个具有不同参数的新控制器时会发生什么?我每次都得这么做?这是我的新路线图和新条目

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "GetOrg",
    url: "{controller}/{action}/{district}",
    defaults: new { controller = "GetOrg", action = "Index", district = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
实际上,我最初是在WebAPI2中开始做Rest的,但是视图模型吸引了我到MVC。在方法上面指定我想要的路由/参数要容易得多,如下所示。这在MVC中可能吗

WebApi2


上述方法似乎比必须依赖于控制器在
RouteConfig

中的正确顺序要干净得多,这是因为两个路由都是通用的,这就是为什么默认情况下它会命中第一个路由,因此您可以删除
UrlParameter。可选的
,因此路由应该有点特定

routes.MapRoute(
        name: "GetOrg",
        url: "{controller}/{action}/{district}",
        defaults: new { controller = "GetOrg", action = "Index"}
    );

但是你仍然可以使用默认的路由,不需要额外的路由,除非你想使用像
random/234

这样的自定义url,这两个路由毫无意义。第一个表示,对于具有任何方法的任何控制器,默认值为
GetOrgController
。这不是您想要的,因为现在
id
不能用于所有其他控制器,而第二个
MapRoute
几乎是重复的

    routes.MapRoute(
        name: "GetOrg",
        url: "{controller}/{action}/{district}",
        defaults: new { controller = "GetOrg", action = "Index", district = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
你真正应该做的是对任何以GetOrg开始的调用说,然后对任何方法调用
GetOrgController

    routes.MapRoute(
        name: "GetOrg",
        url: "GetOrg/{action}/{district}",
        defaults: new { controller = "GetOrg", action = "Index", district = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

为什么不直接说出地区Id?
…我想要下面这样。这在MVC中可能吗?
就像下面回答的@ErikPhilips一样,您的两条路由相互冲突。它们是完全相同的,第一个被击中的将是定义列表中的第一个。不要被愚弄,你可以简单地切换到
RouteAttribute
,现在神奇地排序并不重要,因为它仍然重要。
    routes.MapRoute(
        name: "GetOrg",
        url: "GetOrg/{action}/{district}",
        defaults: new { controller = "GetOrg", action = "Index", district = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );