MVC Uri参数为null

时间:2017-03-21 20:17:57

标签: c# asp.net-mvc

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

控制器

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

中依赖控制器的顺序要清晰得多

2 个答案:

答案 0 :(得分: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 }
    );

答案 1 :(得分:-1)

那是因为两个路径都是通用的,这就是它默认命中第一条路线的原因所以你可以删除UrlParameter.Optional以便路线应该有点具体

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

但是你仍然可以使用默认路由,除非你想使用像random/234这样的自定义网址,否则不需要额外的路由