C# 如何使用选择框扩展标识用户属性

C# 如何使用选择框扩展标识用户属性,c#,asp.net-mvc,entity-framework,razor,asp.net-identity-2,C#,Asp.net Mvc,Entity Framework,Razor,Asp.net Identity 2,我对razor和mvc控制器几乎没有经验。我想在我的注册视图中添加一个下拉框。我在网上尝试了一些不同的例子,但我不知道如何通过应用程序用户访问我需要的类。我想添加一个公司列表。我在浏览客户视图模型时真的迷路了。我把这段关系从公司课上删除了,因为我必须把它清理干净。不知道这需要什么。一个用户只能有一个公司 public class ApplicationUser : IdentityUser { public async Task<ClaimsIdentity>

我对razor和mvc控制器几乎没有经验。我想在我的注册视图中添加一个下拉框。我在网上尝试了一些不同的例子,但我不知道如何通过应用程序用户访问我需要的类。我想添加一个公司列表。我在浏览客户视图模型时真的迷路了。我把这段关系从公司课上删除了,因为我必须把它清理干净。不知道这需要什么。一个用户只能有一个公司

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> 
        GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager
            .CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }

    public int CompanyId { get; set; }
    public virtual Company Company { get; set; }
公共类应用程序用户:IdentityUser
{
公共异步任务
GenerateUserIdentityAsync(用户管理器);
Link=callbackUrl;
返回视图(“显示电子邮件”);
}
加法器(结果);
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
注册视图模型

public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    [Required]
    [Display(Name = "UserName")]
    public string UserName { get; set; }
    [Required]
    [Display(Name = "CompanyName")]
    public int CompanyId { get; set; }
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }

    //Property for the options
    public IEnumerable<SelectListItem> CompanyOptions(int selected)
    {
        //This is just static - get it from somewhere else (database?)
        return new List<SelectListItem>{ 
            new SelectListItem{ Text = "Company 1", Value = "1", Selected = selected.Equals("1") },
            new SelectListItem{ Text = "Company 2", Value = "2", Selected = selected.Equals("2") }
         };
    }
}
公共类RegisterViewModel
{
[必需]
[电邮地址]
[显示(Name=“电子邮件”)]
公共字符串电子邮件{get;set;}
[必需]
[StringLength(100,ErrorMessage={0}的长度必须至少为{2}个字符。”,MinimumLength=6)]
[数据类型(数据类型.密码)]
[显示(Name=“密码”)]
公共字符串密码{get;set;}
[数据类型(数据类型.密码)]
[显示(Name=“确认密码”)]
[比较(“密码”,ErrorMessage=“密码和确认密码不匹配。”)]
公共字符串ConfirmPassword{get;set;}
[必需]
[显示(Name=“UserName”)]
公共字符串用户名{get;set;}
[必需]
[显示(Name=“CompanyName”)]
public int CompanyId{get;set;}
[必需]
[显示(Name=“Name”)]
公共字符串名称{get;set;}
//选项的属性
公共IEnumerable公司选项(选定整数)
{
//这只是静态的-从其他地方获取它(数据库?)
返回新列表{
新建SelectListItem{Text=“Company 1”,Value=“1”,Selected=Selected.Equals(“1”)},
新建SelectListItem{Text=“Company 2”,Value=“2”,Selected=Selected.Equals(“2”)}
};
}
}

您需要将公司列表添加到您的注册模型中,在视图中向用户显示该列表,然后获取所选值并将其应用到post操作中

模型:

//Property for the options
public IEnumerable<SelectListItem> CompanyOptions(string selected)
{
    //This is just static - get it from somewhere else (database?)
    return new List<SelectListItem>{ 
        new SelectListItem{ Text = "Company 1", Value = "1", Selected = selected.Equals("1") },
        new SelectListItem{ Text = "Company 2", Value = "2", Selected = selected.Equals("2") }
    };
}
//选项的属性
公共IEnumerable公司选项(选定字符串)
{
//这只是静态的-从其他地方获取它(数据库?)
返回新列表{
新建SelectListItem{Text=“Company 1”,Value=“1”,Selected=Selected.Equals(“1”)},
新建SelectListItem{Text=“Company 2”,Value=“2”,Selected=Selected.Equals(“2”)}
};
}
现在我们可以将其渲染到视图:

<div class="form-group">
    @Html.LabelFor(model => model.CompanyId, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownListFor(m => m.CompanyId, Model.CompanyOptions(Model.CompanyId), null)
    </div>
</div>

@LabelFor(model=>model.CompanyId,新的{@class=“controllabel col-md-2”})
@DropDownListFor(m=>m.CompanyId,Model.CompanyOptions(Model.CompanyId),null)

现在,您可以在
寄存器
操作中的模型上使用
CompanyId
属性。

第二条错误消息是由于对
DropDownListFor()的第三个参数使用
null
。调用不明确,因为是一个重载,它接受
字符串标签选项
,并且接受
对象htmlAttributes

删除第三个参数(或者如果需要选项标签,请将其设置为
字符串
,例如
string.Empty
,或
“-请选择-”

您也不应该设置
SelectListItem
Selected
属性。DropDownListFor(m=>m.CompanyId,绑定到属性
CompanyId
,因此如果
CompanyId
的值与其中一个选项的值匹配,则将选择该选项(在上面的代码中,如果
CompanyId=2
,则将选择第二个选项)。将忽略所选
属性的值。相反,请将
CompanyOptions
更改为属性

public IEnumerable<SelectListItem> CompanyOptions { get; set; }

不用担心,但是现在获得它是“TransparentEnergy.Models.RegisterViewModel.CompanyOptions(string)”的最佳重载方法匹配'有一些无效的argumentsTry将参数从字符串更改为int。看起来不错。不过,我确实需要一些帮助。我正在使用一个包含用户角色和UserAdmin控件的种子项目。因此,我还使用了一些控制器。你能帮我放置代码吗。我更新了我的帖子。我不理解你的评论。y有什么问题吗你有什么?你的
Create()
方法看起来很奇怪-除了你两次设置
user
的值之外,
params string[]selectedRoles
是什么?为什么
selectedRoles
不是视图模型的属性,你是如何渲染
selectedRoles
的控件的?你编辑的只是重复而已(我想)您在原始版本中的
RegisterViewModel
让我有点困惑。无论如何,它似乎与您的原始问题或您遇到的错误无关,所以这应该是一个新问题。这是一个问题,我使用它是一个种子项目,因为它有用户角色和用户管理准备就绪。我真的不理解d关于它是如何设置的。我只习惯于有一个帐户控制器,这有一个帐户控制器和一个用户管理控制器。所以当我尝试插入你的东西时,我有点迷路了。我会在一段时间后再做一次。我仍然计划感谢你的帮助。谢谢
// GET: /Account/Register
    [AllowAnonymous]
    public ActionResult Register()
    {
        return View();
    }
// POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, CompanyId = model.CompanyId, Name = model.Name };


            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                var callbackUrl = Url.Action("ConfirmEmail", "Account", 
                    new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                await UserManager.SendEmailAsync(user.Id, 
                    "Confirm your account", 
                    "Please confirm your account by clicking this link: <a href=\"" 
                    + callbackUrl + "\">link</a>");
                ViewBag.Link = callbackUrl;
                return View("DisplayEmail");
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    [Required]
    [Display(Name = "UserName")]
    public string UserName { get; set; }
    [Required]
    [Display(Name = "CompanyName")]
    public int CompanyId { get; set; }
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }

    //Property for the options
    public IEnumerable<SelectListItem> CompanyOptions(int selected)
    {
        //This is just static - get it from somewhere else (database?)
        return new List<SelectListItem>{ 
            new SelectListItem{ Text = "Company 1", Value = "1", Selected = selected.Equals("1") },
            new SelectListItem{ Text = "Company 2", Value = "2", Selected = selected.Equals("2") }
         };
    }
}
//Property for the options
public IEnumerable<SelectListItem> CompanyOptions(string selected)
{
    //This is just static - get it from somewhere else (database?)
    return new List<SelectListItem>{ 
        new SelectListItem{ Text = "Company 1", Value = "1", Selected = selected.Equals("1") },
        new SelectListItem{ Text = "Company 2", Value = "2", Selected = selected.Equals("2") }
    };
}
<div class="form-group">
    @Html.LabelFor(model => model.CompanyId, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownListFor(m => m.CompanyId, Model.CompanyOptions(Model.CompanyId), null)
    </div>
</div>
public IEnumerable<SelectListItem> CompanyOptions { get; set; }
public ActionResult Create()
{
  RegisterViewModel model = new RegisterViewModel();
  model.CompanyId = 2; // set this if you want to display a specific company
  ConfigureViewModel(model);
  return View(model);
}

public ActionResult Create(RegisterViewModel model)
{
  if(!ModelState.IsValid)
  {
    ConfigureViewModel(model);
    return View(model);
  }
  // Save and redirect
}

private void ConfigureViewModel(RegisterViewModel model)
{
  model.CompanyOptions = new List<SelectListItem>()
  {
    new SelectListItem() { Text = "Company 1", Value = "1" },
    new SelectListItem() { Text = "Company 2", Value = "2" }
  };
}
model.CompanyOptions = new SelectList(db.Companies, "ID", "Name")