2

У меня есть веб-сайт ASP.NET MVC4 (с использованием vs2012), который позволяет пользователям войти в систему, нажав ссылку «Войти». Я получаю позорную ошибку:MVC Неоднозначное действие для входа

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

Я проверил кучу ссылок здесь, в том числе:

Resolving ambiguity Ambiguous action method call, for some reason 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; } 
} 

А вот информация о маршрутизации ... Я пытался раскомментировать один маршрут (и изменил его имя), но я все еще получаю ту же ошибку:

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?

+0

Возможно, у вас есть два одинаковых маршрута (# 1 и # 3, так как ID является необязательным). Удалите/закомментируйте первый маршрут и оставите только по умолчанию. – Tommy

+0

Я пробовал комментировать каждую из них (по одному), и оба раза она по-прежнему давала мне ту же ошибку. – Robert

+0

Какой url использует 'Url.Action (« Login »,« Account »)' генерирует? –

ответ

1

MVC не поддерживает метод перегрузки исключительно на основе подписи принять [AllowAnonymous] из

добавить [HttpGet] в ГЭТ ActionResult и проблема должна быть решена

[HttpGet] 
public virtual ActionResult Login() 
{ 
    return View(); 
} 
+0

Спасибо за предложение, но я пробовал это, и я получаю ту же ошибку ... что действительно странно. – Robert

+0

уберите [AllowAnonymous]. LogOut() не нуждается в авторизации. вам лучше разрешить все, что вам нужно. Я редактирую ответ –

+0

Еще раз спасибо, но все-таки не-к сожалению :( – Robert

0

Я это и оказалось, что я открыл пространство имен System.Web.Http, которое также определяет атрибуты [HttpGet]/[HttpPost]. Поэтому эти атрибуты использовались в предпочтении тем, что были в System.Web.Mvc, причем последние были ответственны за возможность перегрузки метода в контроллерах на основе глаголов Http. Комментирование

open System.Web.Http 

решили проблему, позволяя Mvc выбрать правильный ([HttGet]) перегрузки.