【发布时间】:2015-04-09 22:17:32
【问题描述】:
我对 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; }
公司类
public class Company
{
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public List<Document> Documents { get; set; }
}
帐户视图模型
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(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.DropDownFor(m => m.CompanyId, Model.CompanyOptions(Model.CompanyId), null)
</div>
错误信息
描述:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。 编译器错误消息:CS1061:“System.Web.Mvc.HtmlHelper”不包含“DropDownFor”的定义,并且无法找到接受“System.Web.Mvc.HtmlHelper”类型的第一个参数的扩展方法“DropDownFor”(您是否缺少 using 指令或程序集引用?) 源错误: 第 41 行:@Html.LabelFor(model => model.CompanyId, new { @class= "control-label col-md-2" }) 第 42 行: 第 43 行:@Html.DropDownFor(m => m.CompanyId, Model.CompanyOptions(Model.CompanyId), null) 第 44 行: 第 45 行: 块引用
新错误
编译器错误消息:CS0121:以下方法或属性之间的调用不明确:'System.Web.Mvc.Html.SelectExtensions.DropDownListFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>, System.Collections.Generic.IEnumerable, System.Collections.Generic.IDictionary)”和“System.Web.Mvc.Html.SelectExtensions.DropDownListFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>, System. Collections.Generic.IEnumerable,字符串)'
用户管理控制器
// GET: /Users/Create
public async Task<ActionResult> Create()
{
//Get the list of Roles
ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
return View();
}
// POST: /Users/Create
[HttpPost]
public async Task<ActionResult> Create(RegisterViewModel userViewModel, params string[] selectedRoles)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
UserName = userViewModel.UserName,
Email = userViewModel.Email,
CompanyId = userViewModel.CompanyId,
Name = userViewModel.Name
};
user.UserName = userViewModel.UserName;
user.Email = userViewModel.Email;
user.CompanyId = userViewModel.CompanyId;
user.Name = userViewModel.Name;
// Then create:
var adminresult = await UserManager.CreateAsync(user, userViewModel.Password);
//Add User to the selected Roles
if (adminresult.Succeeded)
{
if (selectedRoles != null)
{
var result = await UserManager.AddToRolesAsync(user.Id, selectedRoles);
if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
return View();
}
}
}
else
{
ModelState.AddModelError("", adminresult.Errors.First());
ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
return View();
}
return RedirectToAction("Index");
}
ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
return View();
}
帐户控制器
// 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") }
};
}
}
【问题讨论】:
标签: c# asp.net-mvc entity-framework razor asp.net-identity-2