【问题标题】:MVC Uri Parameter is nullMVC Uri 参数为空
【发布时间】:2017-03-21 20:17:56
【问题描述】:

当尝试将参数传递给简单控制器时,我收到的参数始终为空。

控制器

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 导航到该网址时,区域变量始终为null

我想也许它必须对默认的RouteConfig 做点什么。当我在默认路由配置之前放置一个新值时,它起作用了!但是现在,每当我尝试启动应用程序时,它都会首先转到GetOrgController。当我想要一个具有不同参数的新控制器时会发生什么?我必须每次都这样做吗?这是我的新 RouteConfig 和新条目。

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 }
);

实际上,我最初是在 Web Api 2 中开始使用 Rest,但视图模型将我吸引到 MVC。在方法上方指定我想要的路由/参数要容易得多,如下所示。这在 MVC 中可行吗?

WebApi2

[Route("Index/{district}")]
public ActionResult Index(string district)
{
    getorg_Result orgs = de.getorg(district).FirstOrDefault();
    return View(orgs);
}

上述方法似乎比必须依赖RouteConfig中正确的控制器顺序更简洁

【问题讨论】:

  • 为什么不直接命名地区 ID?
  • ...I wanted like below. Is this possible in MVC? MVC 5 Routing Attribute。
  • 就像@ErikPhilips 下面回答的那样,您的 2 条路线相互冲突。它们完全相同,第一个被击中的将是定义列表中的第一个。
  • 不要被愚弄,您可以简单地切换到RouteAttribute,现在订单神奇地无关紧要,因为它仍然如此。

标签: c# asp.net-mvc


【解决方案1】:

这两条路线毫无意义。第一个说,对于具有 ANY 方法的 ANY 控制器,默认为 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 }
    );

【讨论】:

    【解决方案2】:

    那是因为两个路由都是通用的,所以默认情况下它会命中第一条路由,因此您可以删除 UrlParameter.Optional 以便路由应该有点具体

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

    但您仍然可以为此目的使用默认路由,无需额外路由,除非您想使用自定义 url,如 random/234

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2012-05-31
      • 2016-11-22
      相关资源
      最近更新 更多