Asp.Net MVC C#更新/编辑用户模型状态无效

时间:2019-04-05 00:05:55

标签: c# asp.net asp.net-mvc-5 asp.net-identity

我有一个快速的问题,我正在更新用户,那里的角色和我的modelstate.isvalid失败。因此,用户不会在数据库中获得更新。即使我尝试输入所有字段,我也没有[必填]没有输入的任何内容,但仍然失败。不知道为什么。

这是我的数据模型,我用于编辑/更新用户及角色的控制器动作,这也是我的视图,其中包含视图内部的所有控件。 我真的不确定我的模型状态为何无效,我没有做任何复杂的事情,只是在CRUD中只是一个简单的U,而动作控制器没有在验证模型。

public class UpdateUserViewModel
    {
        public string UserId { get; set; }
        [Display(Name = "User ID")]
        public string IdShortened { get; set; }
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }
        [Required]
        [Display(Name = "Username")]
        public string UserName { get; set; }
        [Display(Name = "Your Name")]
        public string Name { get; set; }
        [Display(Name = "Phone Number")]
        public string PhoneNumber { get; set; }
        [DataType(DataType.DateTime),
            DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",
            ApplyFormatInEditMode = true)]
        [Display(Name = "Birthday")]
        public DateTime Birthday { get; set; }
        [Display(Name = "Date Created")]
        public DateTime? DateCreated { get; set; }
        [Required]
        [Display(Name = "User Roles")]
        public string UserRoles { get; set; }
    }
public async Task<ActionResult> EditSuperAdmin(string id)
        {
            if(id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);
            var user = await manager.FindByIdAsync(id);
            if(user == null)
            {
                return HttpNotFound();
            }
            var userRoles = await manager.GetRolesAsync(user.Id);

            ViewBag.Roles = new SelectList(
                context.Roles.ToList(), "Name", "Name");
                //new SelectList(context.Roles.Where(u =>
               //!u.Name.Contains("SuperAdmin")).ToList(), "Name", "Name");

            return View(new UpdateUserViewModel()
            {
                UserId = user.Id,
                IdShortened = user.Id.Substring(0, 10),
                Email = user.Email,
                UserName = user.UserName,
                Name = user.Name,
                PhoneNumber = user.PhoneNumber,
                Birthday = user.Birthday,
                DateCreated = user.DateCreated,
                UserRoles = manager.GetRoles(user.Id).FirstOrDefault()
            });
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult EditSuperAdmin([Bind]UpdateUserViewModel model)
        {
            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);

            if (ModelState.IsValid)
            {
                var user = manager.FindById(model.UserId);
                if (user == null)
                {
                    return HttpNotFound();
                }
                user.Email = model.Email;
                user.UserName = model.UserName;
                user.Name = model.Name;
                user.PhoneNumber = model.PhoneNumber;
                user.Birthday = model.Birthday;
                user.DateCreated = Convert.ToDateTime(model.DateCreated);
                var roleResult =
                    manager.AddToRole(user.Id, model.UserRoles);
                if (!roleResult.Succeeded)
                {
                    TempData["ErrorRole"] = "Error adding User Role";
                    return RedirectToAction("Dashboard");
                }
                manager.Update(user);
                context.SaveChanges();                
                TempData["Success"] = "User Updated Successfully";              
                return RedirectToAction("GetAllUsers", "SuperAdmin");
            }
            TempData["Error"] = "User Update Failed";
            return RedirectToAction("Dashboard");
        } @model MVC_TimeSh.Models.UpdateUserViewModel
@{
    ViewData["Title"] = "Update User";
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <div class="text-center">
            @if (User.IsInRole("SuperAdmin"))
            {
                <h2>Update Super Administrator</h2>
            }
            else
            {
                <h3>Update | Edit User Account</h3>
            }
        </div>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(m => m.UserId)

        <div class="form-group">
            @Html.LabelFor(model => model.IdShortened,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.IdShortened, new { htmlAttributes =
                 new { @class = "form-control", @readonly = "readonly" } })
                @Html.ValidationMessageFor(model => model.IdShortened, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Name,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name,
                 new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Email,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Email, new { htmlAttributes =
                 new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Email, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UserName,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UserName,
                 new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UserName, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.PhoneNumber,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PhoneNumber,
                 new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.PhoneNumber, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Birthday,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Birthday,
                 new { htmlAttributes = new { @class = "form-control datepicker" } })
                @Html.ValidationMessageFor(model => model.Birthday, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.DateCreated,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.DateCreated, new { htmlAttributes =
                 new { @class = "form-control", @readonly = "readonly" } })
                @Html.ValidationMessageFor(model => model.DateCreated, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UserRoles,
             htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("UserRoles", (SelectList)ViewBag.Roles, "-- SELECT --")
                @*new { htmlAttributes = new { @class = "form-control" } })*@

                @Html.ValidationMessageFor(model => model.UserRoles, "",
                 new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-success" />
            </div>
        </div>
    </div>

2 个答案:

答案 0 :(得分:0)

抱歉,没有50个信誉无法发表评论。

如Chetan所说,调试并检查ModelState错误,并检查UserRoles属性是否是问题所在。

答案 1 :(得分:0)

如果您使用实体框架,那会很好。那里一切正常。