0

ルーティングを考え出したと思ったら、思うように動作しません。ASP.Net MVC 4 RC を使用しています。ここに私のRouteConfigがあります:

        routes.MapRoute
        (
            "TwoIntegers",
            "{controller}/{action}/{id1}/{id2}",
            new { controller = "Gallery", action = "Index", id1 = new Int32Constraint(), id2 = new Int32Constraint() }
        );

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

これが私のルート制約です:

public class Int32Constraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (values.ContainsKey(parameterName))
        {
            int intValue;
            return int.TryParse(values[parameterName].ToString(), out intValue) && (intValue != int.MinValue) && (intValue != int.MaxValue);
        }

        return false;
    }
}

/{domain.com}/PageSection/Edit/21

「TwoIntegers」ルートで停止しています。2 番目の整数が渡されていないことは明らかです。

これが私のエラーです:

パラメーター ディクショナリには、'SolutiaConsulting.Web.ContentManager.Controllers.PageSectionController' のメソッド 'System.Web.Mvc.ActionResult Edit(Int32)' の null 非許容型 'System.Int32' のパラメーター 'id' の null エントリが含まれています。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

私は何を間違っていますか?より具体的なルートが最初にリストされています。助けてください。

4

1 に答える 1

2

制約が正しく指定されていません。MapRoute拡張メソッドの正しいオーバーロードを使用していることを確認してください。

routes.MapRoute(
    "TwoIntegers",
    "{controller}/{action}/{id1}/{id2}",
    new { controller = "Gallery", action = "Index" },
    new { id1 = new Int32Constraint(), id2 = new Int32Constraint() }
);

3 番目ではなく、制約を指定するために使用される 4 番目の引数に注意してください。

ところで、名前付きパラメーターを使用してコードを読みやすくすることができます。

routes.MapRoute(
    name: "TwoIntegers",
    url: "{controller}/{action}/{id1}/{id2}",
    defaults: new { controller = "Gallery", action = "Index" },
    constraints: new { id1 = new Int32Constraint(), id2 = new Int32Constraint() }
);

また、正規表現はどうですか?

routes.MapRoute(
    name: "TwoIntegers",
    url: "{controller}/{action}/{id1}/{id2}",
    defaults: new { controller = "Gallery", action = "Index" },
    constraints: new { id1 = @"\d+", id2 = @"\d+" }
);
于 2012-08-08T16:23:37.303 に答える