1

そのため、読みやすくするために URL にハイフンを使用しようとしていますが、これまで mvc4 で機能させる方法が見つかりませんでした。

コントローラーのコードから始めます。

public ViewResult Index()
    {
        ViewBag.URL = Functions.fetchURL();
        return View();
    }

    [HttpPost]
    public ActionResult Index(LogonModel model, string returnUrl)
    {
         //omitted to save space

        return View(model);
    }


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

    [HttpPost]
    public ActionResult Forgot_Login_Info(RetrievePasswordViewModel model)
    {
         //omitted to save space
        return View();

    }

そのため、「Forgot_Login_Info」で見られるように、アクションの名前にアンダースコアを使用しています。これはビューの名前でもあります。テストのために、「Forgot-Login-Info」というビューも手動で作成しました

私のglobal.asax.csファイルには、ルート用にこの行があります

RouteConfig.RegisterRoutes(RouteTable.Routes);

これは MVC4 の新しいプロジェクトの標準ルーティング ラインであり、これは「RouteConfig.cs」ファイルにフックされています。そのファイルには、このサイトの別の質問で見つけたコードがあります。

public class RouteConfig
{
    public class HyphenatedRouteHandler : MvcRouteHandler
    {
        protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-","_");
            requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
            return base.GetHttpHandler(requestContext);
        }
    }



    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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



        routes.Add(
        new Route("{controller}/{action}/{id}",
        new RouteValueDictionary(
            new { controller = "Default", action = "Index", id = UrlParameter.Optional }),
            new HyphenatedRouteHandler())
        );
    }
}

最後に、「Forgot_Login_Info」へのリンクがある「Index」ビューのコードを示します。

 <div class="centerBlockItem" style="width:450px; text-align:center">
@Html.ActionLink("Forgot Password?", "Forgot-Login-Info")
    @Html.ActionLink("Forgot Password?", "Forgot_Login_Info")
</div>

これで、アンダースコアを使用する方法とハイフンを使用する方法の 2 つの方法でリンクが作成されました。この目的のために見つけたコードに関して私が読んだことによると、両方のリンクは「Forgot-Login-Info」ビューではなく「Forgot_Login_Info」ビューを開く必要があります。しかし、代わりに取得しているのは、2番目のリンクが正常に機能し、アクション名がビューファイル名と一致することです。しかし、最初のリンクをクリックすると、テスト用にその名前のファイルを手動で作成したにもかかわらず、システムが「Forgot-Login-Info」ビュー ファイルを見つけることができないため、404 エラーが発生します。

注意すべきもう 1 つの点は、私の routeconfig ファイルのコードです。回答では、デフォルトのルート コード行をコメント アウトしてそのままにしておくことが提案されていることがわかりました。

routes.Add(
        new Route("{controller}/{action}/{id}",
        new RouteValueDictionary(
            new { controller = "Default", action = "Index", id = UrlParameter.Optional }),
            new HyphenatedRouteHandler())
        );

私もこれを行い、同じ結果を得ました。私が物事を台無しにしているアイデアはありますか?

4

2 に答える 2

0

クローラーがコントローラーのアンダースコア バージョンに引き続きアクセスできる場合、これは SEO にどのように役立ち、それによってコンテンツが複製されますか。現在これと格闘中。

于 2013-05-20T15:56:23.957 に答える
0

Ok I figured out what I was doing wrong, I had this listed under the root routebundle.cs file but i was trying to make this work in an area, once I moved this code to the area registration file, it worked like a charm. If anyone needs my full code listing just ask and i'll post it all up.

于 2012-10-24T16:02:52.437 に答える