属性路由:未将对象引用设置为对象的实例

时间:2015-09-11 18:43:20

标签: asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing

我使用此代码进行属性路由。

我的控制员:

[RouteArea("Administrator")]
[Route("{action}")]
public partial class HomeController : Controller
{
    [HttpGet]
    [Route("~/Home/Template/{id}")]
    public virtual ActionResult Template(string template)
    {
        switch (template.ToLower())// error :Object reference not set to an instance of an object..
        {
            case "main":
                return PartialView(Url.Content(MVC.Administrator.Home.Views.Main));
            default:
                throw new Exception("template not known");
        }
    }
}

RouteConfig:

 internal static class RouteConfig
    {
        internal static void RegisterRoutes(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Administrator_default",
                "Administrator/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { string.Format("{0}.Controllers", typeof(RouteConfig).Namespace) });
        }
    }

url:http://localhost:22738/home/template/main

如何使用属性路由?

有没有办法解决这个问题?我不知道

1 个答案:

答案 0 :(得分:1)

您可能需要花些时间阅读属性路由的文档。请参阅:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

首先,您尚未启用属性路由。在RouteConfig.cs中需要以下内容:

routes.MapMvcAttributeRoutes();

其次,您不能将[Route]应用于控制器类。您可以使用[RoutePrefix],如果这是您正在寻找的内容。但是,请记住,如果在路由前缀中包含一个参数,则所有操作都必须接受该参数。虽然,由于你在这里有一个action的参数,但你完全不可能理解它是如何工作的。您没有通过属性路由传递操作名称。被击中的动作由具有匹配路线的动作决定。

第三,当您在某个操作上定义路线时,只需指定RouteAreaRoutePrefix未涵盖的路线的部分。使用代字号(~)表示你想要忽略所有设置的前缀并定义动作的整个路线,如果这是你真正想要的,那很好,但只是保持请记住,您不必遵循RouteConfig.cs中默认路由使用的/Controller/Action/{id}约定。属性路由的重点是轻松定义自定义路由。如果您要依赖默认路由,那么您也可以使用它并忘记属性路由。

最后,在您的路线中,您接受了参数id,但您的行为并未接受。相反,它有自己的template参数。参数需要匹配,或者路线不匹配或者行动不能起作用。

总而言之,您可能正在寻找以下内容:

[RouteArea("Administrator")]
[RoutePrefix("home")]
public partial class HomeController : Controller
{
    [Route("template/{template}")]
    public virtual ActionResult Template(string template)
    {
        switch (template.ToLower())// error :Object reference not set to an instance of an object..
        {
            case "main":
                return PartialView(Url.Content(MVC.Administrator.Home.Views.Main));
            default:
                throw new Exception("template not known");
        }
    }
}