2011-01-06 15 views
1

どのように私は、localhostのようなかなりのURLを取得することができます:8888 /ニュース/例 - ポストlocalhostの代わりに:8888 /ホーム/詳細/ 2プリティURL ASP.NET MVC

私にHomeControllerが詳細方法については、以下のい

public ActionResult Details(int id) 
{ 
    var ArticleToView = (from m in _db.ArticleSet where m.storyId == id select m).First(); 

    return View(ArticleToView); 

答えて

9

ASP.NETルーティングシステムはやや複雑なので、説明する内容を達成する方法はたくさんあります。

まず、詳細メソッドのかなりのURLが必要ですか?もしそうなら、HomeControllerの名前をNewsControllerに変更するか、Detailsメソッドを新しいNewsControllerクラスに移動してURLの一部を自動的に構成してください(/News)。 /Detailsの部分が不要な場合は、によって自動的に呼び出されるように、詳細メソッドIndexの名前を変更することができます。最後に、int idパラメータをstring nameに変更する必要があります。

多くのカスタムURLが必要な場合は、独自のルートを定義する必要があります。

1. 私が見つけた最も簡単な方法があるASP.NET MVC Attribute-Based Route Mapperを使用します。ここではこれを行うには、2つの方法がです。そうすれば、それぞれのメソッドに属性を追加して、きれいなURLを付け、必要なURLを指定するだけです。

まず、リンクに概要を示すように、属性ベースのルートマッピングシステムを設定するために、いくつかの手順を実行する必要があります。 これらの手順を完了したら、あなたはこのように見えるためにあなたの方法を変更する必要があります。また

[Url("News/{name}")] 
public ActionResult Details(string name) 
{ 
    var ArticleToView = (from m in _db.ArticleSet where m.storyName == name select m).First(); 

    return View(ArticleToView); 
} 

2. 、あなたはGlobal.asax.csに手動でカスタムルートを定義することができます。あなたのRegisterRoutes方法では、途中で次の項目を追加することができます。

routes.MapRoute(
       "NewsDetails",             
       "News/{name}",         
       new { controller = "News", action = "Details", name = "" } 
      ); 
+0

追加のアドオンなどを必要とせずにこれを行うための組み込みの方法はありません – Cameron

+0

@Cameron確かにあります:y Global.asaxで簡単にルートを定義することはできますが、リンクしたようなものを使うと余分なDLLの価値があることがわかりました。 –

+0

HomeController内のすべてのメソッドについてHome to Newsを変更するだけではどうですか? – Cameron

1

私は自分のサイト上で行うことは、私はページタイトルを持つことができる場合にはページのタイトルやページスタブのいずれかに対してURLを確認することです同じ名前の複数の名前を持つように、タイトルの代わりにスタブを使用したい場合は、「今週の写真」を投稿するサイトがある場合は同じ名前を使用します。

URLは次のようになります。

routes.MapRoute("Pages", "{controller}/{pageID}", new { controller = "Page", action = "Index", pageID = "Home" }); 

PageControllerではこれです:http://mySite.com/Page/Verse-of-the-Week

Global.asaxのは、この含まれてい

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Index(string pageID) 
    { 
     if (pageID == null) 
     { 
      pageID = pageRepository.HomeOrLowest(); 
     } 
     var p = pageRepository.ByStub(pageID); 
     if (p == null) { return RedirectToAction("NotFound", "Error"); } 
     return View(p); 
    } 

リポジトリには、次のようになります。

private static Func<mvCmsContext, string, Page> _byStub = 
     CompiledQuery.Compile((mvCmsContext context, string pageTitle) => 
      (from p in context.Pages 
      where p.pageTitle.Replace(" ", "-") == pageTitle 
      select p).SingleOrDefault()); 
    public Page ByStub(string pageTitle) 
    { 
     return _byStub(context, pageTitle); 
    } 

私はそれが助けてくれることを願っています。

編集重複処理を追加するには:

private static Func<mvCmsContext, string, int> _pageExists = 
     CompiledQuery.Compile((mvCmsContext context, string pageTitle) => 
      (from p in context.Pages 
      where p.pageTitle.Replace(" ", "-") == pageTitle 
      select p).Count()); 
    public bool PageExists(string pageTitle) 
    { 
     return Convert.ToBoolean(_pageExists(context, pageTitle)); 
    } 

は次のように検証します:

 IValidationErrors errors = new ValidationErrors(); 
     if (CreateOrEdit == "Create") 
     { 
      if (pageRepository.PageExists(model.pageTitle) && !String.IsNullOrEmpty(model.pageTitle)) 
       errors.Add("pageTitle", "A page with this title already exists. Please edit it and try again."); 
     } 
+0

マーク - 重複するページ名をどのように緩和するかをもう少し詳しく説明できますか。私はあなたが言っていることの要点を得るが、重複の発生を完全に取り除く方法については明確ではない(ページIDを追加するか?)。ありがとう.. –

+0

それはサイトによって異なります。個人的なサイトでは、ValidationErrorsをスローし、ページの名前を変更するように要求します。数字や日付を簡単に追加(または前置)してから、再度実行して必要に応じて増分することもできます。編集した投稿にPageExistsチェックが含まれています。 – mark123