我使用此代码进行属性路由。
我的控制员:
[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
如何使用属性路由?
有没有办法解决这个问题?我不知道
答案 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
的参数,但你完全不可能理解它是如何工作的。您没有通过属性路由传递操作名称。被击中的动作由具有匹配路线的动作决定。
第三,当您在某个操作上定义路线时,只需指定RouteArea
或RoutePrefix
未涵盖的路线的部分。使用代字号(~
)表示你想要忽略所有设置的前缀并定义动作的整个路线,如果这是你真正想要的,那很好,但只是保持请记住,您不必遵循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");
}
}
}