ASP.Net MVC измените идентификатор строки по умолчанию на и int, используя документы, получите ошибку, хотя

#c# #asp.net-mvc #entity-framework #asp.net-identity

#c# #asp.net-mvc #entity-framework #asp.net-identity

Вопрос:

Я сделал базовую ASP.Net Веб-проект MVC. Я переключил все свои идентификаторы с string на int с помощью документов Microsoft.

https://learn.microsoft.com/en-us/aspnet/identity/overview/extensibility/change-primary-key-for-users-in-aspnet-identity#run

Я внес эти изменения в обновлении MVC 3 изменения. Когда я компилирую и запускаю свой новый проект, он отображается как int в моем файле, но я получаю сообщение об ошибке и не могу завершить запуск проекта.

Это то, что мои сообщения отображают в выходных данных:

Возникло исключение: ‘System.FormatException’ в mscorlib.dll Исключение типа ‘System.FormatException’ произошло в mscorlib.dll но не было обработано в пользовательском коде, строка ввода была не в правильном формате.

Любой ввод был бы оценен. Я запустил миграцию, и она отображается как int , но не запускается в моем браузере полностью.

 app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator
                    .OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentityCallback: (manager, user) => 
                        user.GenerateUserIdentityAsync(manager), 
                        getUserIdCallback:(id)=>Int32.Parse(id.GetUserId()))
                }
            });
  

Мой код прерывается в этой части, и это исключение
id.GetUserId()

Это в startup.auth.cs

Спасибо.

Комментарии:

1. Очень сложно определить, в чем может быть ошибка, без фрагментов кода, где это происходит неправильно. Пожалуйста, проясните вопрос

2. Покажите нам строку, в которой возникает ошибка

3. Извините всех, теперь обновлено

4. Это первый код или первый db?

5. кодируйте, что БД не создается, пока я не запущу проект, и я еще ни разу не запускал проект успешно, поэтому ни одна БД еще не является их. это моя система ошибок. Исключение FormatException: ‘Входная строка была не в правильном формате.’

Ответ №1:

Итак, чтобы сформулировать это как ответ на ваш вопрос, Parse метод использует текущую локаль для преобразования вашей строки в целое число. Я бы предположил, что в вашем случае GetUserID() будет в формате, который в вашей текущей локали ожидал бы запятую в качестве десятичной точки. Следовательно, предоставление необязательного параметра CultureInfo.InvariantCulture сделало бы ваш язык нечувствительным к культуре. Альтернативой было бы предоставить второй необязательный параметр для предоставления IFormatProvider.

Чтобы устранить вашу ошибку, установите эту строку как:

 (id)=>Int32.Parse(id.GetUserId(),CultureInfo.InvariantCulture)
  

Для получения дополнительной информации о CultureInfo.Инвариантная культура.

Приветствия.

Комментарии:

1. Моя программа некоторое время работала нормально, и я даже не прикасался к этому, так как я исправил это с вами, теперь внезапно я снова получаю эту ошибку, ту же самую, и я ничего не трогал в этом, я добавил контроллер с новыми представлениями, но они перестали загружаться, потому что эта ошибка снова regenerateIdentityCallback: (manager, user) => user. Генерируйте useridentityasync (manager), получите USERIDCALLBACK:(id) => Int32.Parse(id. GetUserId(), CultureInfo. Инвариантная культура) )

2. @Bigbear Вы преобразуете число в целое число. Итак, если ваше id.GetUserId() равно 4.5, например, это приведет к сбою, потому что это не целое число. Поэтому используйте Int32.TryParse() в вашем случае, потому что Int32.TryParse() вернет значение, которое сообщит вам, удался синтаксический анализ или нет.

3. Как бы я поместил это в свою часть моей программы? getUserIdCallback:(id) => Int32. Попробуйте проанализировать (id. GetUserId(), //CultureInfo.CurrentCulture) CultureInfo. Инвариантная культура)

4. @Bigbear Смотрите этот простой пример для TryParse : dotnetfiddle.net/DTnA2H . В вашем коде вам нужно было бы сначала проверить, прошло ли ваше преобразование id.GetUserId() успешно или нет. Основываясь на логическом значении, которое вы получаете с помощью этого метода, вы можете соответствующим образом обрабатывать свои сценарии. Тогда вам даже не нужно будет устанавливать свой id.GetUserId() , как вы делаете прямо сейчас. Если преобразование прошло успешно, то установите: getUserIdCallback:(id)=>id.GetUserId()) , else //handle if conversion did not succeed

Ответ №2:

Чтобы ответить на мой вопрос.

В моем startup.auth.cs

Я следовал всем документам Microsoft, как я ранее заявлял.

Я продолжал получать ошибку при запуске своего проекта.

Добавляю CultureInfo в качестве второго параметра в моем ConfigureAuth() в CookieAuth.

Вот мой завершающий код проекта.

                      {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator
                    .OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>
                    (
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentityCallback: (manager, user) => 
                        user.GenerateUserIdentityAsync(manager), 
                        getUserIdCallback:(id) => Int32.Parse(id.GetUserId(), 
                        CultureInfo.InvariantCulture)
                        //getUserIdCallback:(id) => (Int32.Parse(id.GetUserId()))
                    )
                }