MVC路由仅适用于某些操作结果

时间:2014-01-15 05:28:28

标签: c# asp.net-mvc asp.net-mvc-routing

我是否必须为控制器中的每个操作结果路由一个特殊路由,或者您是否执行一条路由,并且必须遵循该标准认为控制器?我以为你可以创建一个默认路由,然后为你想要的任何实例创建一个特殊路由。我一直遇到一个问题,我的一条路线会正确地击中我的行动结果,但其他人不再有效。这段代码可能是错误的方式,但因此我在这里发布它的原因。如果可以,请尽量为我澄清这个问题。据我所知,我认为能够做{controller} / {action} / {id}。所以应该点击Settings / GetSite / {siteid}以获取以下内容

 public ActionResult GetSite(int id);

路线配置:

routes.MapRoute(
            "SettingsUpdateEnviorment",
            "{controller}/{action}",
            new { controller = "Settings", action = "UpdateProperties" },
            new { httpMethod = new HttpMethodConstraint("POST") }
        );



        routes.MapRoute(
           name: "ProfileRoute",
           url: "Profiles/{userId}",
           defaults: new
           {
               controller = "Profile",
               action = "Index",
           }
       );

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


        routes.MapRoute(
            "Settings",                                           // Route name
            "Settings/{id}",                            // URL with parameters
            new { controller = "Settings", action = "Index" }  // Parameter defaults
        );

控制器代码:

public ActionResult Index(int id)
    {

        return View(model);
    }

    public ActionResult GetSite(int enviornmentID, string name)
    {

        return RedirectToAction("Index");
    }

    [HttpPost]
    public ActionResult AddSite(int id)
    {           
        return RedirectToAction("Index", new { id = id });
    }

因此,URL按照预期的设置/ 1来命中索引actionresult索引(int id)。然后,当我尝试使用以下actionLink为GetSite(int enviornmentID,string name)执行ActionResult时:

 @Html.ActionLink(site.Name, "GetSite", "Settings", new { enviornmentID = Model.Enviorment.EnvironmentID, name = site.Name }, null)

它正确地创建URL,如下所示:Settings / GetSite?enviornmentID = 1& name = CaseyTesting2,但是给出了一个错误,指出我正在尝试向我的Index(int id)actionResult发送一个空值。我认为既然我正在使用动作名称并且它是相同的参数,那么MVC会想出路线吗?为什么这对我不起作用,或者我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:0)

由于这篇文章http://www.itworld.com/development/379646/aspnet-mvc-5-brings-attribute-based-routing,我意识到自己在做什么。当我把一切都纠正的时候,我正在混淆订单。然后我错过了参数名称相同,当其他一切都正确时。因此,在尝试找出问题时,我一直遇到一些小问题。我也切换到了MVC5的属性路由,并且更喜欢它。

所以这是我现在正在运行的代码:

RoutConfig

routes.MapMvcAttributeRoutes();



        routes.MapRoute(
           name: "ProfileRoute",
           url: "Profiles/{userId}",
           defaults: new
           {
               controller = "Profile",
               action = "Index",
           }
       );

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

控制器代码

[Authorize]
[RoutePrefix("settings")]
[Route("{action=index}")]
public class SettingsController : ZenController
{       
    [Route("{id:int}")]
    public ActionResult Index(int id)
    {


        return View(model);
    }

    [Route("GetSite/{sitename:alpha}")]
    public ActionResult GetSite(string sitename)
    {

        return RedirectToAction("Index");
    }

再次感谢大家!快乐的编码!