【问题标题】:MVC4 : DropDownList works but not DropDownListForMVC4:DropDownList 有效,但 DropDownListFor 无效
【发布时间】:2013-05-28 08:19:59
【问题描述】:

我希望有 管理员方面的注册表单。

现在我的DropDownList 可以工作,但我不知道如何获取值并将其写入数据库(Sql server compact)。然后我再次认为可能使用DropDownList 会更好,并且可以工作,但我得到错误。这是我的模型

 public class UserModel
    {
        public int UserId { get; set; }

        [Required]
        [EmailAddress]
        [StringLength(100)]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email ID ")]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [StringLength(20, MinimumLength = 6)]
        [Display(Name = "Password ")]
        public string Password { get; set; }

        [Required]
        [Display(Name = "First Name ")]
        public string FirstName { get; set; }

        [Required]
        [Display(Name = "Last Name ")]
        public string LastName { get; set; }

        [Required]
        [Display(Name = "Address ")]
        public string Address { get; set; }

        public List<string> PossibleRights;

        [Required]
        [Display(Name = "Access Rights")]
        public string AccessRight { get; set; }

    }

我需要从dropdownlist 获取值并将其设置为Accessright

我的控制器

 public List<SelectListItem> UserAccessRight()
        {
            var rights = new List<SelectListItem>
                {
                    new SelectListItem {Text = "Full", Value = "0"},
                    new SelectListItem {Text = "Partial", Value = "1"}
                };
            return rights;
        }

        [HttpGet]
        public ActionResult Register()
        {
            var rights = UserAccessRight();
            ViewBag.right = rights;
            return View();
        }

        [HttpPost]
        public ActionResult Register(Models.UserModel user)
        {

            if (ModelState.IsValid)
            {
                using (var db = new DBaseEntities())
                {
                    var crypto = new SimpleCrypto.PBKDF2();

                    var encrpPass = crypto.Compute(user.Password);

                    var sysUser = db.SystemUsers.Create();

                    sysUser.FirstName = user.FirstName;
                    sysUser.LastName = user.LastName;
                    sysUser.Address = user.Address;
                    sysUser.Email = user.Email;
                    sysUser.Password = encrpPass;
                    sysUser.PasswordSalt = crypto.Salt;

                    sysUser.AccessRight = user.AccessRight;


                    db.SystemUsers.Add(sysUser);
                    db.SaveChanges();

                    return RedirectToAction("Index", "Home");

                }
            }
            else
            {
                ModelState.AddModelError("","Login data is incorrect.");
            }
            return View();
        }

        private bool IsValid(string email, string password)
        {
            var crypto = new SimpleCrypto.PBKDF2();

            bool isValid = false;
            using (var db = new DBaseEntities())
            {
                var user = db.SystemUsers.FirstOrDefault(u => u.Email == email);

                if (user!= null)
                {
                    if (user.Password == crypto.Compute(password, user.PasswordSalt) )
                    {
                        isValid = true;
                    }
                }

            }

            return isValid;
        }

我的看法

 <h4>Signup Now!</h4>


            <div class="editor-label">@Html.LabelFor(u=> u.FirstName)</div>
            <div class="editor-field"> @Html.TextBoxFor(u=> u.FirstName)</div>   
            <br/>
            <div class="editor-label">@Html.LabelFor(u=> u.LastName)</div>
            <div class="editor-field"> @Html.TextBoxFor(u=> u.LastName)</div> 
            <br/>
            <div class="editor-label">@Html.LabelFor(u=> u.Address)</div>
            <div class="editor-field"> @Html.TextBoxFor(u=> u.Address)</div> 
            <br/>
            <div class="editor-label">@Html.LabelFor(u=> u.Email)</div>
            <div class="editor-field"> @Html.TextBoxFor(u=> u.Email)</div> 
            <br/>
            <div class="editor-label">@Html.LabelFor(u=> u.Password)</div>
            <div class="editor-field"> @Html.PasswordFor(u=> u.Password)</div> 
            <br/>
            <div class="editor-label">@Html.LabelFor(u=> u.AccessRight)</div>
            <div class="editor-field"> @Html.DropDownList("right")</div>

            <br/>
            <input type="submit" value="Register"/>

当我尝试将 @Html.DropDownList("right") 更改为 @Html.DropDownListFor((u=&gt;u.AccessRight, new SelectList("right", "value", "text"),"--Select Right--") 我出错了。编辑:错误说“用户代码未处理 HttpException 数据绑定:“System.Char”不包含名为“value”的属性

提前致谢。

【问题讨论】:

  • 我最后把它添加为编辑。

标签: asp.net-mvc asp.net-mvc-4 model-binding html.dropdownlistfor html-select


【解决方案1】:

试试这个

 @Html.DropDownListFor(model => model.AccessRight, new SelectList(ViewBag.right , "id", "Text "))

在模型中,访问权限应包含存在于 Viewbag.right 中的 Enumerable 类型的有效 id。

访问权限应包含一个您希望在下拉列表中选择的值

编辑:-

 @Html.DropDownListFor(model => model.AccessRight, new SelectList(ViewBag.right , "value", "Text "))

Datavalue 字段的名称应与列表相同

希望对你有帮助

【讨论】:

  • 仍然是同样的错误,现在不是 value 它说不包含名称为“id”的属性
  • 所以我的模型中的 AccessRight 不应该是字符串,应该是可枚举类型?在模型中没有使用 AccessRight 获得该部分。你能解释更多可能吗?
  • 访问权限应该包含一个您希望在下拉列表中显示为选中的值。它应该是整数类型。所以它会从你的 viewbag.right 中检查它是可枚举类型的,并将其显示为预先选择的。
  • 我非常感谢,但现在我在db.SaveChanges(); 部分Register 操作中遇到错误。说用户代码未处理 DbUpdateException。任何的想法?还是我应该问新问题?
  • 我认为这是因为我试图在 post 方法中添加用户,而不是在 get 方法中
【解决方案2】:

尝试更改以下代码

来自

<div class="editor-field"> @Html.DropDownList("right")</div>

<div class="editor-field"> @Html.DropDownList("AccessRight","Provide list of items here")</div>

提交后,您将自动获得 AccessRight 模型中的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2012-05-08
    • 2017-03-15
    • 2014-10-30
    • 2011-03-08
    • 2013-11-27
    • 2010-11-29
    相关资源
    最近更新 更多