2013-04-17 4 views
0
public class CheckoutController : Controller 
{ 
    string userID; 

    public CheckoutController() 
    { 
     userID = User.Identity.Name; 
    } 
    ... 
} 

Когда я запускаю приведенный выше код, я получаю эту ошибку,Asp.net MVC4, конструктор контроллера

**Make sure that the controller has a parameterless public constructor.** 

В этом классе наиболее метода необходимо, что идентификатор пользователя, поэтому я хочу, чтобы определить, что значение в конструкторе, как я могу решить эту проблему?

[Редактировать]

public class CheckoutController : Controller 
{ 
    string userID; 

    public CheckoutController() 
    { 
     //None 
    } 
} 

Этот код работает отлично, без ошибок.

+2

Вы уверены, что это контроллер, который звонит? Похоже, у вас уже есть конструктор без параметров. – DavGarcia

+0

Если да, то вы недавно перестроили свой код? Он может быть устаревшим ... –

+0

@Expert, поскольку это нестандартно, только конструкторы без параметров работают 'public CheckoutController()', но вы хотели бы использовать 'public CheckoutController (int userId)'? – Jasen

ответ

3

Выполнение трубопроводов, связанные значения (Request, Response и User) являются переплетены ТОЛЬКО ПОСЛЕ метод конструктора Controller «ы. Вот почему вы не можете использовать User.Identity, поскольку он еще не привязан. Только после Шаг 3: IController.Execute() - это когда эти контекстуальные значения инициализируются.

http://blog.stevensanderson.com/blogfiles/2007/ASPNET-MVC-Pipeline/ASP.NET%20MVC%20Pipeline.jpg

Обновлено Poster:link to a newer poster based on @mystere-man's feedback thanks to @SgtPooki. Но я сохраняю более старое встраиваемое изображение здесь, чтобы сделать его более легким для ссылки.

ASP.NET MVC Pipeline

User.Identity.Name не оказывает отрицательного влияния на производительность, как это уже было расшифровано из FormsAuthentication печенья с помощью выполнения ASP.NET (если вы используете FormsAuthentication для вашего веб-приложения).

Так что не утруждайте его кэшированием переменной класса.

public class CheckoutController : Controller 
{ 
    public CheckoutController() { /* leave it as is */ } 

    public ActionResult Index() 
    { 
     // just use it like this 
     string userName = User.Identity.Name; 

     return View(); 
    } 
} 
+1

FYI, этот график является устаревшим, я думаю, что это было для Pre-CTP1 MVC1, и все изменилось немного позже. Там гораздо лучше упоминается здесь http://blog.stevensanderson.com/2009/10/08/aspnet-mvc-learning-resource-request-handling-pipeline-poster/ –

+0

Спасибо вам обоим. Кроме того, я представил изменение, чтобы обеспечить лучшую ссылку. И только в случае: http://i.imgur.com/96jp1eu.png – SgtPooki

Смежные вопросы