2017-09-14 23 views
0

私のURLをスラッグとうまくやさしく見えるようにしようとしています。私はうまくいったが、私のデフォルトルーティングは動作しなくなった。 このexample.com/location/viewlocation/528にアクセスすると、urlはexample.com/528/a-nice-locationのようになります。slugとidを使用したMVC URLルーティング。デフォルトのルーティングで混乱を招く

しかし、今私の通常のものはdosent仕事。エラーでexample.com/home/index結果に タイピング

パラメータ辞書はSystem.Web.Mvc」メソッドのパラメータの非NULL可能タイプ「可能System.Int32」の「ID」にNULLエントリを含みます.ActionResult ViewLocation(Int32、System.String) '' Oplev.Controllers.LocationController 'にあります。オプションのパラメータは、参照型、null可能型、またはオプションのパラメータとして宣言する必要があります。

私はさまざまな解決方法を試しましたが、私は何か不足しています。それを働かせることはできません。

マイコード: RouteConfig

routes.MapRoute(
      name: "view_location", 
      url: "{id}/{slug}", 
      defaults: new { controller = "Location", action = "ViewLocation", id = UrlParameter.Optional, slug = UrlParameter.Optional } 
     ); 

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

場所コントローラ

public ActionResult ViewLocation(int id, string slug) 
    { 
     if (string.IsNullOrEmpty(slug)) 
     { 
      slug = "a-nice-location"; // testing.. 
      return RedirectToRoute("view_location", new { id = id, slug = slug }); 
     } 
     return View(); 
    } 

ホームコントローラ

public ActionResult Index() 
{ 
    return View(); 
} 

答えて

0

だから私は何とか何とかうまくいった!これにview_locationため 変更ルーティング:

  routes.MapRoute(
      name: "view_location", 
      url: "{id}/{slug}", 
      defaults: new { controller = "Location", action = "ViewLocation", slug = UrlParameter.Optional}, 
      constraints: new { id = @"\d+" } 
     ); 
+0

に必要なRoute属性を使用するか、 'int型を使用することができますRouteConfig

//Attribute routing routes.MapMvcAttributeRoutes(); // placed before convention-based routes //convention-based routes routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 

で有効になっている?'代わりint' 'のタイプ。メッセージは簡単です。null以外の型を使用している場合は、ルートの数値制約を宣言する必要があります。 –

1

あなたの最初のルートは、URLに0、1または2のセグメントでは何も一致しました。たとえば、../Home/Indexと一致します。あなたは、たとえば、あなたがそれ

routes.MapRoute(
    name: "view_location", 
    url: "ViewLocation/{id}/{slug}", 
    defaults: new { controller = "Location", action = "ViewLocation", slug = UrlParameter.Optional } 
); 

作ることができるか、あなただけの最後のパラメータがUrlParameter.Optionalとしてマークすることができることをもルート制約に

ノートを追加することができ、それを区別するためにいくつかの方法が必要になりますが、あなたのケースでidは、とにかくオプションではありません。

0

これは、既に与えられた回答を補うためのものです。経路制約付きの属性ルーティングも機能します。

まず確認してください属性のルーティングは、次のコントローラ

[HttpGet] 
[Route("{id:int}/{*slug?}", Name = "view_location")] // Matches GET 528/some-nice-location 
public ActionResult ViewLocation(int id, string slug) { 
    if (string.IsNullOrEmpty(slug)) { 
     slug = "a-nice-location"; // testing.. 
     return RedirectToRoute("view_location", new { id = id, slug = slug }); 
    } 
    return View(); 
} 
関連する問題