1

これが私の希望する URL 形式です: /product-24-hid-35wh4-cx-dsgtx

この URL をアクション メソッドにマップするにはどうすればよいですか。

public ActionResult Product(int id)

これが私のルーティングコードです:

  routes.MapRoute(
       "ProductDetail",
       "product-{id}-{name}",
        new { controller = "product", action = "detail", name = UrlParameter.Optional },
        new string[] { "SphereLight.Controllers" }
  );

ただし、機能しません。このルートをテストするために phil haack の routedebugger を使用しました。結果は次のとおりです。

 Key    Value
 name   dsgtx 
 id         24-hid-35wh4-cx 
 controller product 
 action detail 

id = 24のみが正しいです。

一言で言えば、一致するルートが必要です。

   /product-24
   /product-24-
   /product-24-hid-35wh4-cx-dsgtx
4

1 に答える 1

2

MapRouteに制約を追加してみてください。

  routes.MapRoute(
       "ProductDetail",
       "product-{id}-{name}",
        new { controller = "product", action = "detail", name = UrlParameter.Optional },
        new { id = @"\d+" }, // <-- change it for @"[^-]+", if it can be non-digit
        new string[] { "SphereLight.Controllers" }
  );

更新:
ついにそれを手に入れました。
主な問題は、同じセパレーターを含むパラメーターを使用できないことです。たとえば、上記の例は。では機能します/product-24-nmが、では機能しませんproduct-24-nm-smth

それで、この解決策を試してみましょう:
私はデフォルトのルーティングでそれを作りました、あなたはそれをあなたのやり方で作ることができます

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

の実装MyRouteHandler

public class MyRouteHandler : MvcRouteHandler
{
    private static readonly Regex ProductPattern = new Regex(@"product\-(\d+)\-?(.*)");

    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var match = ProductPattern.Match(requestContext.RouteData.Values["controller"].ToString());
        if (match.Length > 0)
        {
            requestContext.RouteData.Values["controller"] = "Home";
            requestContext.RouteData.Values["action"] = "Detail";
            requestContext.RouteData.Values["id"] = match.Groups[1].Value;
            requestContext.RouteData.Values["name"] = match.Groups[2].Value;
        }
        return base.GetHttpHandler(requestContext);
    }
}

したがって、主なアイデアは、値product-id-nameがハンドラーのパターンと一致するかどうかを確認することであり、でそれを作成しようとしないことですMapRoute。お役に立てれば。

于 2012-05-17T08:32:40.423 に答える