当前位置: 代码迷 >> C# >> MVC5注册页面提交表单的2个有关问题(模型验证和新增数据)
  详细解决方案

MVC5注册页面提交表单的2个有关问题(模型验证和新增数据)

热度:75   发布时间:2016-05-05 02:36:43.0
MVC5注册页面提交表单的2个问题(模型验证和新增数据)
本帖最后由 qq_25768813 于 2015-10-05 17:29:47 编辑
耽搁了一天,实在解决不了.先谢谢各位前辈指导

环境:windows 10,vs2015,sql server 2012
语言:c# mvc5

功能说明:一个简单的注册功能,用户注册时实例化用户注册类,模型验证成功后赋值给用户类,然后新增用户数据
类:用户类,用户注册类
控制器:用户类控制器(MVC5空)
视图:自定义的用户注册页面


问题描述:1,在模型验证失败后,重新渲染的视图页面,失败的那几个字段所在的控件,根本就点不了,改不了内容.没有报错的还是正常.如下图:


2,模型验证成功后,保存新增的用户数据时,报错.如下图:


附上代码:
用户类代码:

 public class User
    {
        public int Id { get; set; }

        [Display(Name = "帐号")]
        [RegularExpression(@"^[a-zA-Z0-9]{6,16}$", ErrorMessage = "亲,帐号只能由6到16位的数字或字母组成")]
        [StringLength(maximumLength: 16, MinimumLength = 6)]
        //[Remote("/Users/CheckName")]
        [Required(ErrorMessage = "{0}必须填写")]
        public string Name { get; set; }

        [Display(Name = "登陆密码")]
        [DataType(DataType.Password)]
        [StringLength(maximumLength: 16, MinimumLength = 6)]
        [RegularExpression(@"^[a-zA-Z0-9]{6,16}$", ErrorMessage = "亲,密码只能由6到16位的数字或字母组成")]
        [Required(ErrorMessage = "{0}必须填写")]
        public string Password { get; set; }

        [Display(Name = "用户状态")]
        [Required(ErrorMessage = "{0}必须填写")]
        public Boolean State { get; set; }

        [Display(Name = "余额")]
        [Range(minimum: 0, maximum: 99999)]
        [Required(ErrorMessage = "{0}必须填写")]
        public Decimal Account { get; set; }

        [Display(Name = "昵称")]
        [StringLength(maximumLength: 10, MinimumLength = 1)]
        [Required(ErrorMessage = "{0}必须填写")]
        public string NickName { get; set; }

        [Display(Name = "电话")]
        [DataType(DataType.PhoneNumber)]
        public string Tel { get; set; }

        [Display(Name = "QQ号")]
        [StringLength(maximumLength: 13, MinimumLength = 5)]
        [RegularExpression(@"^[0-9]{5,13}$", ErrorMessage = "亲,这个QQ号太高大上了")]
        public string QQ { get; set; }

        [Display(Name = "VIP时间")]
        [Required(ErrorMessage = "{0}必须填写")]
        public DateTime VipTime { get; set; }

        [Display(Name = "QQ标识")]
        [StringLength(maximumLength: 100, MinimumLength = 6)]
        public string QQID { get; set; }

        [Display(Name = "默认快递")]
        [Required(ErrorMessage = "{0}必须填写")]
        public int DefaultEx { get; set; }
    }


用户注册类代码:

public class RegisterView
    {
        [Display(Name = "帐号")]
        [RegularExpression(@"^[a-zA-Z0-9]{6,16}$", ErrorMessage = "亲,帐号只能由6到16位的数字或字母组成")]
        [StringLength(maximumLength: 16, MinimumLength = 6)]
        //[Remote("/Users/CheckName")]
        [Required(ErrorMessage = "{0}必须填写")]
        public string Name { get; set; }

        [Display(Name = "登陆密码")]
        [DataType(DataType.Password)]
        [RegularExpression(@"^[a-zA-Z0-9]{6,16}$", ErrorMessage = "亲,密码只能由6到16位的数字或字母组成")]
        [Required(ErrorMessage = "{0}必须填写")]
        public string Password { get; set; }

        [Display(Name = "确认密码")]
        [DataType(DataType.Password)]
        [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "两次密码必须一样")]
        public string PasswordConfirm { get; set; }

        [Display(Name = "QQ号")]
        [Required(ErrorMessage = "{0}必须填写")]
        [RegularExpression(@"^[0-9]{5,13}$", ErrorMessage = "亲,这个QQ号太高大上了")]
        public string QQ { get; set; }
    }


用户注册控制器,注册方法代码:

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index([Bind(Include = "Name,Password,PasswordConfirm,QQ")] RegisterView userRegister)
        {
            v1._2.Models.User user = new Models.User(); 
            if (ModelState.IsValid)
            {
                user.Name = userRegister.Name;
                user.Password = userRegister.Password;
                user.State = true;
                user.Account = 0;
                user.NickName = userRegister.Name;
                user.Tel = null;
                user.QQ = userRegister.QQ;
                user.VipTime = DateTime.Now;
                user.QQID = null;
                user.DefaultEx = 1;
                db.Users.Add(user);
                db.SaveChanges();
                return RedirectToAction("success");
            }

            return View(userRegister);
        }


用户注册视图:

<div class="panel-body">
                    @using (Html.BeginForm())
                    {
                        @Html.AntiForgeryToken()

                        <div class="form-horizontal col-md-11">
                            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                            <div class="form-group">
                                @Html.LabelFor(m => m.Name, new { @class = "control-label col-md-3 col-sm-3 col-xs-3" })
                                <div class="input-group col-md-9 col-sm-9 col-xs-9">
                                    <span class="input-group-addon btn"><i class="glyphicon glyphicon-user"></i></span>
                                    @Html.EditorFor(m => m.Name, new { htmlAttributes = new { @class = "form-control", placeholder = "6-16位字母或数字" } })
                                </div>
                                <div class="col-md-12 text-right text-danger">@Html.ValidationMessageFor(m => m.Name)</div>                                
                            </div>

                            <div class="form-group">
                                @Html.LabelFor(m => m.Password, new { @class= "control-label col-md-3 col-sm-3 col-xs-3" })
                                <div class="input-group col-md-9 col-sm-9 col-xs-9">
                                    <span class="input-group-addon btn"><i class="glyphicon glyphicon-lock"></i></span>
                                    @Html.EditorFor(m=>m.Password,new { htmlAttributes = new { @class = "form-control", placeholder = "6-16位数字或字母" } })
                                </div>
                                <div class="col-md-12 text-right text-danger">@Html.ValidationMessageFor(m => m.Password)</div> 
                            </div>

                            <div class="form-group">
                                @Html.LabelFor(m => m.PasswordConfirm, new { @class="control-label col-md-3 col-sm-3 col-xs-3"})
                                <div class="input-group col-md-9 col-sm-9 col-xs-9">
                                    <span class="input-group-addon btn"><i class="glyphicon glyphicon-repeat"></i></span>
                                    @Html.EditorFor(m => m.PasswordConfirm, new { htmlAttributes = new { @class = "form-control", placeholder = "两次密码必须一样" } })
                                </div>
                                <div class="col-md-12 text-right text-danger">@Html.ValidationMessageFor(m => m.PasswordConfirm)</div> 
                            </div>

                            <div class="form-group">
                                @Html.LabelFor(m => m.QQ, new { @class = "control-label col-md-3 col-sm-3 col-xs-3" })
                                <div class="input-group col-md-9 col-sm-9 col-xs-9">
                                    <span class="input-group-addon btn"><i class="glyphicon glyphicon-bell"></i></span>
                                    @Html.EditorFor(m => m.QQ, new { htmlAttributes = new { @class = "form-control", placeholder = "找回密码用,选填" } })
                                </div>
                                <div class="col-md-12 text-right text-danger">@Html.ValidationMessageFor(m => m.QQ)</div> 
                            </div>

                            <div class="form-group">
                                <div class="input-group col-md-9 col-sm-9 col-xs-9 col-md-offset-3">
                                    <input type="submit" class="form-control btn btn-danger" id="btnOkResiter" value="立即注册" onclick="Register();" />
                                </div>
                                <input id="txtPengYouRegister" type="hidden" name="txtPengYouRegister" value="0" />
                            </div>
                        </div>
                    }
                </div>

------解决思路----------------------
红色的提示信息是ErrorMessage?加上这个字段的Name?进行提示,后面那个错误是保存出现错误。要你自己断点去看。