0

私は十分にシンプルなパンフレット サイトをまとめており、学習の機会として MVC3 を使用することにしました。Web サイトの特定のセクションのコンテンツは DB に保存され、シンプルな GUI を介して管理者が更新できます。私にとって初めてのこの言語でデータベース操作を行う方法を学ぶために、事前に構築された CMS を再び使用しないことにしました。

非常に単純な URL 構造が必要です。

foo.com (home)
foo.com/bio
foo.com/news
foo.com/about
foo.com/events

これを実現する簡単な方法は、各ページにコントローラーを用意し、Index()各コントローラーの ActionResult を使用することです。

サイトのこれらのページごとにコントローラーを用意することは問題ありませんか? ニュースとイベントにはサブページはありませんが、ページングがあり、URL は次のようになります。

foo.com/news/
foo.com/news/page2
foo.com/news/page3
foo.com/news/page4

単一のコントローラーがあり、複数のアクションを使用した場合、URL はデフォルトで次のようになります。

foo.com (home)
foo.com/home/bio
foo.com/home/news
foo.com/home/about
foo.com/home/events

次に、ルーティングを更新して、目的を達成する必要があります。

4

2 に答える 2

0

単一のコントローラーを使用する場合は、試してみてください。

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

ルート定義として。また、「ニュース」と「イベント」のページングのみを許可するには、カスタム ルート制約を次のように使用します。

public class PagingConstraint : IRouteConstraint
{
    private static readonly string[] PagingEnabledActions = new string[] { "news", "events" };

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return string.IsNullOrEmpty(values[parameterName].ToString()) || new Regex(@"^[Pp][Aa][Gg][Ee][0-9]+$", RegexOptions.Compiled).IsMatch(values[parameterName].ToString())
            && PagingEnabledActions.Contains(values["action"].ToString().ToLower());
    }
}

お役に立てれば。

于 2013-02-03T20:43:23.587 に答える
0

コントローラーの使用に関しては、メイン メニューの階層ではなく、アクションのドメインまたはコンテンツのドメインに特定のコントローラーを使用するのがベスト プラクティスだと思います。

例えば:

あなたのメインページ:

foo.com

コントローラー -> ホーム

メソッド -> インデックス

パラメータ -> null

foo.com/news/2

コントローラー -> ニュース

メソッド -> インデックス

パラメータ -> 2

しかし、Home と News は 2 つの異なる "同等の" コントローラーです。たまたま、ユーザーが最初に操作するコントローラーが Home コントローラーです。

于 2013-02-03T12:25:51.877 に答える