2

ユーザーが「ログイン」リンクをクリックしてログインできるASP.NET MVC4 Webサイト(vs2012を使用)があります。悪名高いエラーが表示されます:

The current request for action 'Login' on controller type 'AccountController' is ambiguous between the following action methods: System.Web.Mvc.ActionResult Login() on type MyProject.Controllers.AccountController System.Web.Mvc.ActionResult Login(MyProject.Clients) on type MyProject.Controllers.AccountController

ここで、次のような多くのリンクを確認しました。

あいまいさの解決あいまい なアクション メソッド呼び出し、何らかの理由で ASP.NET MVC 3

SOの外にさらにいくつか。メソッドが正しく装飾されていることを確認しましたが、これが発生している理由をまだ見つけることができません。

「ログイン」リンクのコードは次のとおりです。

    <ul class="topnav navRight">
        @if (!User.Identity.IsAuthenticated)
        {
            <li><a href="@Url.Action("Login", "Account")" id="ViewLogin">LOGIN</a></li>
        }
        else
        {
            <li><a href="@Url.Action("Index", "ClientStats")">STATS</a></li>
            <li><a href="@Url.Action("LogOut", "Account")">LOGOUT</a></li>
        }
    </ul>

と私のコントローラー:

[Authorize]
public class AccountController : CustomController
{
    //
    // GET: /Account/Logout
    public ActionResult LogOut()
    {
        WebSecurity.Logout();
        return RedirectToAction("Index", "Home");
    }

[AllowAnonymous]
public virtual ActionResult Login()
{
    return View();
}

[HttpPost]
[AllowAnonymous]
public virtual ActionResult Login(Clients model)
{
    if (ModelState.IsValid)
    {
        Security security = new Security();

        if (WebSecurity.Login(model.Username, model.Password))
        {
            using (MyProjectContext db = new MyProjectContext())
            {
                int userID = WebSecurity.GetUserId(model.Username);
                Data.User user = db.Users.Find(userID);

                if (user != null)
                    if (user.Active)
                    {
                        if (User.IsInRole("Administrator"))
                            return RedirectToAction("Admin", "ClientStats");
                        else
                            return RedirectToAction("Index", "ClientStats");
                    }
            }
        }
    }

    ModelState.AddModelError("", "Invalid Username or Password.");

    return View(model);
}

}

CustomerController特別なことは何もありませんが、とにかくここにあります:

    public class CustomController : Controller
{
    public enum PageNames
    {
        Home,
        Services,
        Testimonials,
        Video,
        Photo,
        FAQ,
        About,
        Contact,
        Events,
        Profile
    }

    public int UserId
    {
        get { return Convert.ToInt32(Session["UserId"]); }
        set { Session["UserId"] = value; }
    }

    public static string GetPageTitle(PageNames pageName)
    {
        string pageTitle = "Welcome to My Website!";

        switch (pageName)
        {
            case PageNames.Services:
                pageTitle = "- Services";
                break;

            case PageNames.Testimonials:
                pageTitle = "- Testimonials";
                break;

            case PageNames.Video:
                pageTitle = "- Videos";
                break;

            case PageNames.Photo:
                pageTitle = "- Photos";
                break;

            case PageNames.FAQ:
                pageTitle = "- Frequently Asked Questions";
                break;

            case PageNames.Contact:
                pageTitle = "- Contact Us";
                break;

            case PageNames.Events:
                pageTitle = "- Calnedar of Events";
                break;

            case PageNames.Profile:
                pageTitle = "- Profile";
                break;
        }

        return pageTitle;
    }

    public static Data.User ClientInfo { get; set; }
}

そして、これがルーティング情報です...1つのルートのコメントを外そうとしました(そして名前を変更しました)が、それでも同じエラーが発生します:

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

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

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

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

ヘルプ/ガイダンスは大歓迎です!

UPDATE ルーティング値をコメントアウトして[HttpGet]Loginメソッドに追加するという提案を試みましたが、それでも同じエラーがスローされます。私はこれが一度に機能したことを覚えているので、突然これを行うために最近何が変更されたのかわかりません。それは Web.Config の何かでしょうか?

4

2 に答える 2

1

MVC は、署名の取り出し [AllowAnonymous] のみに基づくメソッドのオーバーロードをサポートしていません

[HttpGet] を get actionresult に追加すると、問題は解決するはずです

[HttpGet]
public virtual ActionResult Login()
{
    return View();
}
于 2013-12-05T23:35:42.287 に答える