2016-10-29 15 views
0

が、私は基本的に特定の地域のために、このように見えるようにURLを望んでいた(AdminArea課)ASP.NET MVC URLルーティングは、階層構造を持つ私は、ASP.NET MVCでいくつかのルーティングを実行しようとしてい

http://localhost/admin/folders/folder1/folder2

私は上記の構造を望んでいますが、私は解決できないいくつかの問題に取り組んでいます。

最初の問題は、時にはURLが

?私が欲しいものではありませんパーマリンク=フォルダ名

のようなクエリ文字列として終わるということです。

ここに私が定義したルートがあります。

  context.MapRoute 
     (
       "folder_route", 
       "Administration/folders/{*permalink}", 
       defaults: new { controller = "folders", action = "Index",permalink = UrlParameter.Optional }, 
       constraints: new { permalink = new FolderURLConstraint() } 

     ); 

制約:

public class FolderURLConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (values[parameterName] != null) 
     { 
      var permalink = values[parameterName].ToString(); 
      return new FolderDAL().ValidateFolderURLSlug(permalink); 
     } 
     return false; 
    } 
} 

検証:

 public bool ValidateFolderURLSlug(string folderName) 
    { 
     if (!string.IsNullOrEmpty(folderName)) 
     { 

      string[] splitFolder = folderName.Split(new string[] { "/"}, StringSplitOptions.RemoveEmptyEntries); 
      string lastValue = splitFolder[splitFolder.Length - 1]; 

      string[] folderNames = GetFolderBreadCrumb(lastValue.ToLower()).Select(p => p.FolderName.ToLower()).ToArray();; 

      splitFolder = splitFolder.Select(s => s.ToLower()).ToArray(); 

      bool isEqual = Enumerable.SequenceEqual(splitFolder, folderNames); 

      return isEqual; 
     } 

     return false; 

    } 

インデックスページ:grid.GetHtml @ (tableStyle:「表table-接さテーブル凝縮テーブルのストライプ"、

columns:grid.Columns(

      grid.Column("FolderName", "Folder Name", 
      format:(item) => Html.ActionLink((string)item.FolderName, "index", "folders", new {permalink=item.FolderName}, null)), 
      grid.Column("DateCreated", "Date Created"), 
      grid.Column(header:"Action", format: 
      @<text> 
      <a href="@Url.Action("delete", "Folders", new {id=item.PrimaryKey })"><span class="fa fa-trash"></span></a> 
      <a href="@Url.Action("edit", "Folders", new {id=item.PrimaryKey })"><span class="fa fa-edit"></span></a> 
      </text>) 

     ) 

URLを生成するには、/ folder1/folder2のようなURLを生成したいと思います。たとえば、ページフォルダをクリックすると、/ページのようなURLが表示されますが、ページのホームフォルダをクリックすると、 /ページ/家庭のようなURLを取得する

私はそれを得ることができませんまた、何らかの理由で、最初の階層のドロップ後にクエリ文字列を追加するようです。メインページ(/フォルダ/)のよう

あなたがページ内の

/ページ/

が、フォルダに移動したいフォルダをクリックします(自宅を言うことができます)

ます/ foldersのようなリンクがありますか?permalink =ホーム

私は/ pages/homeと入力しても、これは動作します。

ご協力いただければ幸いです。

答えて

0

こんにちはAgent47私は別のaproachを使用することを検討する必要があります。

通常、カスタムハンドラーとカスタムHTMLヘルパーを作成して、Html.ActionLinkをオーバーライドします。

RouteConfigは:

routes.MapRoute(
     "IUrlRouteHandler", 
     "{*url}", 
     new[] { "YourApp.Controllers" }).RouteHandler = new UrlRouteHandler(); 

だから、あなたのルールを管理するためのhttp://localhost/admin/folders/folder1/folder2

public sealed class UrlRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var url = requestContext.HttpContext.Request.Url.ToString(); 
     var routeData = requestContext.RouteData.Values; 

     // manage your rules here! 

     routeData["controller"] = "YourController"; 
     routeData["action"] = "YourAction"; 

     return new MvcHandler(requestContext); 
    } 
} 

使用url変数上の例のために任意の "URL" を受け取ることになりますUrlRouteHandlerという名前のクラスを実装する必要がありますコントローラ名とアクション名を指定することを忘れないでください。あなたは、データベース内のURLを見ることができます。静的なクラスでは、すべてのセグメントを分割して、アプリケーションが応答するコントローラとアクションを決定します。

関連する問題