Почему мой идентификатор пользователя возвращает имя пользователя, что приводит к ошибке преобразования?

Я следую этому руководству http://tutlane.com/tutorial/aspnet-mvc/asp-net-mvc-membership-provider-to-create-users-roles-mapping-roles-to-users..

Когда я пытаюсь добавить роль, я получаю следующую ошибку:

Input string was not in a correct format.

на этой линии

var User = GetUserName_BY_UserID(Convert.ToInt32(objvm.UserId));

Я думаю, проблема в том, что UserId возвращает имя пользователя, а не UserId, но я не знаю, что я сделал не так, чтобы получить имя пользователя.

Контроллер аккаунта Ролеаддтуусер

  [HttpGet]
        public ActionResult RoleAddToUser()
        {
            AssignRoleVM objvm = new AssignRoleVM(); //http://tutlane.com/tutorial/aspnet-mvc/asp-net-mvc-membership-provider-to-create-users-roles-mapping-roles-to-users
            objvm.RolesList = GetAll_Roles();
            objvm.Userlist = GetAll_Users();
            return View(objvm);
        }

   [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult RoleAddToUser(AssignRoleVM objvm)
        {
            //Validation inside RoleAddtoUser ActionMethod: First validation to check both dropdownlist are select or not.
            if (objvm.RoleName == "0")
            {
                ModelState.AddModelError("RoleName", "Please select RoleName");
            }
            if (objvm.UserId == "0")
            {
                ModelState.AddModelError("UserName", "Please select Username");
            }
            if (ModelState.IsValid)
            {
                GetUserName_BY_UserID(Convert.ToInt32(objvm.UserId));
                var User = GetUserName_BY_UserID(Convert.ToInt32(objvm.UserId));
                Roles.AddUserToRole(User, objvm.RoleName);
                ViewBag.ResultMessage = "Username added to the role successfully !";

                objvm.RolesList = GetAll_Roles();
                objvm.Userlist = GetAll_Users();
                return View(objvm);
            }
            else
            {
                objvm.RolesList = GetAll_Roles();
                objvm.Userlist = GetAll_Users();
            }
            return View(objvm);
        }

AccountController GetUserName_BY_UserID

public string GetUserName_BY_UserID(int UserId)
{
    using (UsersContext context = new UsersContext())
    {
        var UserName = (from UP in context.UserProfiles
                        where UP.UserId == UserId
                        select UP.UserName).SingleOrDefault();
        return UserName;
    }
}

Модели AccountModel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Globalization;
using System.Web.Security;

namespace AccountModule_Attempt_5.Models
{
    public class UsersContext : DbContext
    {
        public UsersContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<UserProfile> UserProfiles { get; set; }
        public DbSet<Customer> Customers { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<webpages_UsersInRoles> webpages_UsersInRole { get; set; }
       // public DbSet<RegisterModel> UserProfiles { get; set; }
        //public DbSet<RegisterModel>Users { get; set; }
       // public DbSet<UsersRole> UsersRoles { get; set; }   
    }

    [Table("webpages_UsersInRoles")]
    public class webpages_UsersInRoles
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }

        public int RoleId { get; set; }
    }

AssignRoleVM.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Web.Mvc;

namespace AccountModule_Attempt_5.Models
{
    public class AssignRoleVM
    {

        [Required(ErrorMessage = " Select Role Name")]
        public string RoleName { get; set; }
        [Required(ErrorMessage = "Select UserName")]
        public string UserId { get; set; }

        public List<SelectListItem> Userlist { get; set; }
        public List<SelectListItem> RolesList { get; set; }
    }
}

UserProfile.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace AccountModule_Attempt_5.Models
{
    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }

        [Required]
        public string UserName { get; set; }
        public string EmailId { get; set; }

        [Required]       
        public string CustomerId { get; set; }

    }

}

Роли.cs

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace AccountModule_Attempt_5.Models
{

    [Table("webpages_Roles")]
    public class Role
    {
        [Required(ErrorMessage = "Enter Role name")]
        //[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        public string RoleName { get; set; }

        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int RoleId { get; set; }
    }
}

person Josh McGee    schedule 28.11.2016    source источник
comment
Я думаю, проблема в том, что UserId возвращает имя пользователя, а не UserId: почему вы так думаете? Почему вы не уверены, так или иначе?   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 28.11.2016
comment
В качестве примечания, '_' в вашем соглашении об именах может взъерошить некоторые перья в реальной рабочей среде (здесь делается много предположений, извините :))   -  person Darren Wainwright    schedule 28.11.2016
comment
Что ж, я знаю, что он возвращает имя пользователя, потому что, когда я пытаюсь добавить роль, я вижу имя пользователя при наведении указателя мыши на objvm.UserId в методе RoleAddToUser, а не на UserId. Чего я не знаю, так это того, что проблема в этом, потому что я все еще довольно новичок в этом.   -  person Josh McGee    schedule 28.11.2016
comment
@JoshMcGee - вы конвертируете свой идентификатор пользователя в int; Идентификация ASP.Net обычно использует GUID для идентификатора пользователя, поэтому попробуйте вместо этого использовать Guid, а не int. - сначала проверьте свою базу данных на предмет типа UserID или наведите указатель мыши на свойство objvm.UserID в отладке и посмотрите, как оно на самом деле выглядит.   -  person Darren Wainwright    schedule 28.11.2016
comment
@Darren, где мне добавить этот код? Я попытался заменить Convert.ToInt32(objvm.UserId), но получил Argument1: невозможно преобразовать из System.Guid в «int», и если я заменю всю переменную на это, это приведет к тому, что System.Guid будет «строкой» в следующей строке .   -  person Josh McGee    schedule 28.11.2016


Ответы (2)


Основная причина проблемы заключается в том, что вы пытаетесь преобразовать строковую переменную (не числовую) в Int32. Чтобы UserId был преобразован в Int 32, он должен быть числовым.

Кроме того, идентификатор пользователя не следует смешивать с другими символами, кроме цифр.

Например, если идентификатор пользователя равен «101», он будет преобразован без проблем. Но идентификатор пользователя «Zbra101» не может быть преобразован в Int 32.

person Auguste    schedule 28.11.2016
comment
Спасибо. Это моя проблема. UserId должен быть числовым. Почему он возвращает имя пользователя? Когда я смотрю в свою таблицу UserProfile, у меня есть UserId и UserName. Я думаю, что это должно вернуть UserId. - person Josh McGee; 28.11.2016

вы можете попробовать это. Добавьте изменения в AccountController.

[HttpGet]
 public ActionResult RoleAddToUser()
{
        AssignRoleVM objvm = new AssignRoleVM(); 
        objvm.RolesList = GetAll_Roles();
        objvm.Userlist = GetAll_Users();
        return View(objvm);
}

   [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult RoleAddToUser(AssignRoleVM objvm)
    {

        if (objvm.RoleName == "0")
        {
            ModelState.AddModelError("RoleName", "Please select RoleName");
        }
        if (objvm.UserId == "0")
        {
            ModelState.AddModelError("UserName", "Please select Username");
        }
        if (ModelState.IsValid)
        {

            var User = objvm.UserId;
            Roles.AddUserToRole(User, objvm.RoleName);
            ViewBag.ResultMessage = "Username added to the role successfully !";

            objvm.RolesList = GetAll_Roles();
            objvm.Userlist = GetAll_Users();
            return View(objvm);
        }
        else
        {
            objvm.RolesList = GetAll_Roles();
            objvm.Userlist = GetAll_Users();
        }
        return View(objvm);
    }
person Codelover    schedule 13.08.2019