Как создать ограничение для этого URL-маршрута? - PullRequest
1 голос
/ 03 мая 2011
   routes.MapPageRoute("View Home Page",
        "{homepage}",
        "~/home.aspx",
        true,
        new RouteValueDictionary { { "homepage", "national" } },
        new RouteValueDictionary { { "region", "^(national|bc|ab|on){0,1}$" } }
       );

Я хочу, чтобы маршрут соответствовал URL, таким как http://www.mydomain.com/national, http://www.mydomain.com/bc, http://www.mydomain.com/ab, или http://www.mydomain.com/on

Как построить ограничение?

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

В итоге я написал собственное ограничение, поэтому мой код теперь выглядит так:

routes.MapPageRoute("View Home Page",
        "{region}/default.aspx",
        "~/home.aspx",
        true,
        new RouteValueDictionary { { "region", "national" } },
        new RouteValueDictionary { { "region", new HomePageConstraint() } }
       );

и класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;

/// <summary>
/// Summary description for HomePageConstraint
/// </summary>
public class HomePageConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return GetRegions().Any(x => x.ToLower() == values[parameterName].ToString().ToLower());

    }


    private List<string> GetRegions()
    {
        List<string> set = new List<string>();
        set.Add("National");
        set.Add("BC");
        set.Add("AB");
        set.Add("SASK");
        set.Add("MAN");
        set.Add("ON");
        set.Add("QC");
        set.Add("Maritimes");
        set.Add("NL");

        return set;

    }
}

Отлично работает (я использую веб-формы ине mvc - я уверен, что это работает в обоих случаях).Нашел как тут: http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx

0 голосов
/ 03 мая 2011

Ответов пока нет, поэтому я дам вам знать, что я сделал. К сожалению, механизм маршрутизации для ASP.NET MVC не самый лучший.

Вам нужно будет изменить соответствующие переменные в соответствии с маршрутизацией и представлениями, но это должно помочь вам начать.

Поместите это как последний маршрут, который вы отображаете:

routes.MapRoute("Root", "{pathName}", new
{ 
    controller = "Root", 
    action = "Default"
});

А в вашем контроллере:

public class RootController : Controller
{

    [HttpGet]
    public ActionResult Default(string pathName)
    {
        // No pathName? 

        if (String.IsNullOrWhiteSpace(pathName)) {
            return this.View("~/Views/Root/home.aspx")
        }

        // Check to see if there's a view for the pathName

        var viewPath = String.Format("~/Views/Root/{0}.aspx", pathName);

        if (File.Exists(Server.MapPath(viewPath))) {
            return this.View(viewPath);
        }

        // Not found

        this.Response.StatusCode = System.Net.HttpStatusCode.NotFound;
        return this.View("~/Views/404.aspx");
    }

}

Поэтому вам нужно будет назвать ваши взгляды в соответствии с ожидаемыми вами «pathNames»:

  • ~ / Views / Root / national.aspx
  • ~ / Views / Root / ab.aspx
  • ~ / Views / Root / bc.aspx

Это не так уж плохо, если вы не возражаете против подобных соглашений.

...