【发布时间】:2015-10-30 01:39:10
【问题描述】:
我在 ASP.NET MVC 5 中使用 Simple Membership 来使用我现有的 SQL Server。在注册页面中,我使用下拉框来填充用户角色。在我的帐户控制器中,我使用 [HttpGet] 和 [HttpPost] 进行注册操作。当我运行我的网络应用程序并转到注册页面时,我可以看到我的 DropDownBox 填充了来自我的 SqlServer 的数据。
但是当我尝试创建新用户并选择一个角色时,我得到了错误;
"不存在具有键 'roleName' 的 'IEnumerable' 类型的 ViewData 项"
这是我的帐户控制器代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SimpleMemberShip.Models;
using WebMatrix.WebData;
using System.Web.Security;
namespace SimpleMemberShip.Controllers
{
public class AccountController : Controller
{
// ****** REGISTER PAGE ACTION ******
[HttpGet]
public ActionResult Register()
{
//Roles for DropDown Box
IEnumerable<SelectListItem> RolesList = new System.Web.Mvc.SelectList(System.Web.Security.Roles.GetAllRoles(), "roleName");
ViewData["roleName"] = RolesList;
return View();
}
// ****** REGISTER PAGE ACTION with PARAMETERS ******
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(Register registerdata, string RoleName)
{
if (ModelState.IsValid)
{
try
{
WebSecurity.CreateUserAndAccount(registerdata.Username, registerdata.Password);
System.Web.Security.Roles.AddUserToRole(registerdata.Username, RoleName);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException exception)
{
ModelState.AddModelError("", "Warning: Username exist...");
return View(registerdata);
}
}
ModelState.AddModelError("", "Warning: Username exist....");
return View(registerdata);
}
}
}
这是我的 Register.cshtml 代码的样子:
@using SimpleMemberShip.Models
@model Register
@{
ViewBag.Title = "Register";
}
<h2>New User Registration</h2>
<br />
<div>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<label>User Name:</label>
@Html.TextBoxFor(m => m.Username, new { @class = "form-control" })
<br />
<label>User Password:</label>
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
<br />
<label>Roles</label>
@Html.DropDownList("roleName", (System.Web.Mvc.SelectList)ViewBag.roleName, "Select a Role")
<br />
<br />
<button class="btn btn-primary">Register</button>
}
</div>
有人知道我哪里出错了吗?
亲切的问候,
【问题讨论】:
-
当 POST 失败并且您尝试
return View(registerdata)时,ViewBag 为空,因此无法填充下拉列表。顺便说一句,您应该在RegisterViewModel 中包含选择列表,而不是使用 ViewBag。
标签: c# asp.net asp.net-mvc simplemembership