IdentityUser不包含“名称”的定义

时间:2018-10-14 17:25:20

标签: c# html postgresql razor model-view-controller

该项目正在创建一个网上商店。我搭建了所有的身份文件,并创建了一个相同的视图/模型(剃刀页面),就像身份中的一个,但现在用于添加地址信息。我正在尝试创建一个可以在其中添加地址信息的表格,因此注册时不包括该信息。为了存储数据,我们使用PostgresQL,并且通过迁移成功创建了数据库。

地址模型(错误发生在user.name = model.name等;),他无法识别任何变量(姓氏,街道编号等)

namespace bytme.Areas.Identity.Pages.Account.Manage
{
public class AddressModel : PageModel
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly SignInManager<IdentityUser> _signInManager;
    private readonly ILogger<AddressModel> _logger;

    public AddressModel(
        UserManager<IdentityUser> userManager,
        SignInManager<IdentityUser> signInManager,
        ILogger<AddressModel> logger)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _logger = logger;
    }

    [BindProperty]
    public InputModel Input { get; set; }

    public string ReturnUrl { get; set; }

    [TempData]
    public string StatusMessage { get; set; }

    public class InputModel
    {
        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Name")]
        [StringLength(100, ErrorMessage = "Invalid input. Maximum is 100 characters.")]
        public string name { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Surname")]
        [StringLength(100, ErrorMessage = "Invalid input. Maximum is 100 characters.")]
        public string surname { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Street")]
        [StringLength(48, ErrorMessage = "The longest street name in the Netherlands is 48 characters.")]
        public string street { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "House Number")]
        [StringLength(5, ErrorMessage = "The longest house number in the Netherlands is 5 characters.")]
        public string streetnumber { get; set; }

        //[DataType(DataType.Text)]
        //[Display(Name = "House Number Addition", Description = "For example A or II")]
        //[StringLength(6, ErrorMessage = "
        //public string streetnumberadd { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "City")]
        [StringLength(28, ErrorMessage = "The longest place name in the Netherlands is 28 characters.")]
        public string city { get; set; }

        [Required]
        [DataType(DataType.PostalCode)]
        [Display(Name = "Postal Code")]
        [RegularExpression(@"^[1-9][0-9]{3}\s?[a-zA-Z]{2}$", ErrorMessage = "Invalid zip, for example: 1234AB")]
        public string zipcode { get; set; }
    }

    public void OnGet(string returnUrl = null)
    {
        ReturnUrl = returnUrl;
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> AccountChange(InputModel model)
    {
        if (ModelState.IsValid)
        {
            // Get the current application user
            var user = await _userManager.GetUserAsync(User);

            //Update the details
            user.name = model.name;
            user.surname = model.surname;
            user.street = model.street;
            user.streetnumber = model.streetnumber;
            user.city = model.city;
            user.zipcode = model.zipcode;

            // Update user address
            var result = await _userManager.UpdateAsync(user);
        }

    return RedirectToPage();

}

地址视图

@page
@model AddressModel
@{
    ViewData["Title"] = "Add address information";
}
<h4>@ViewData["Title"]</h4>
@Html.Partial("_StatusMessage", Model.StatusMessage)
<div class="row">
    <div class="col-md-6">
        <form id="change-password-form" method="post">
            <div asp-validation-summary="All" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Input.name"></label>
                <input asp-for="Input.name" class="form-control" />
                <span asp-validation-for="Input.name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.surname"></label>
                <input asp-for="Input.surname" class="form-control" />
                <span asp-validation-for="Input.surname" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.street"></label>
                <input asp-for="Input.street" class="form-control" />
                <span asp-validation-for="Input.street" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.streetnumber"></label>
                <input asp-for="Input.streetnumber" class="form-control" />
                <span asp-validation-for="Input.streetnumber" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.city"></label>
                <input asp-for="Input.city" class="form-control" />
                <span asp-validation-for="Input.city" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.zipcode"></label>
                <input asp-for="Input.zipcode" class="form-control" />
                <span asp-validation-for="Input.zipcode" class="text-danger"></span>
            </div>
            <button type="submit" class="btn btn-default">Submit</button>
        </form>
    </div>
</div>

@section Scripts {
    <partial name="_ValidationScriptsPartial" />
}

UserModel,它扩展到IdentityUser

namespace bytme.Models
{
public class UserModel : IdentityUser
    {
    public override string Id { get; set; }
    public override string Email { get; set; }
    public override string UserName { get; set; }
    public override string PasswordHash { get; set; }
    public string zipcode { get; set; }
    public string city { get; set; }
    public string street { get; set; }
    public string streetnumber { get; set; }
    public string name { get; set; }
    public string surname { get; set; }
      }
}

Startup.cs

namespace bytme
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseNpgsql(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<UserModel, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseAuthentication();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在使用UserManager<IdentityUser>,而应该使用UserManager<UserModel>IdentityUser实例未定义name属性,您在UserModel类中定义了此属性。要解决您的问题,您应该做两件事:

1)转到Startup.cs => ConfigureServices method,添加:

 services.AddIdentity<UserModel, IdentityRole>()
    .AddEntityFrameworkStores<YourDatabaseContextClassNameHere>()
    .AddDefaultTokenProviders();

2)注入UserManager<UserModel> userManagerSignInManager<UserModel> signInManager而不是UserManager<IdentityUser> userManagerSignInManager<IdentityUser> signInManager