用户名可用性并插入新用户

时间:2016-02-02 02:52:41

标签: entity-framework asp.net-mvc-4

我使用Entity Framework在表中插入全名。

插入之前我想检查记录是否已插入。

这是我的View模型,模型和动作

public class VMUsers
{
    [Key]
    [Column("tblUsers.Id")]
    public int Id { get; set; }
    public MVCLearning.Models.Users InsertUser { get; set; }

    public  MVCLearning.Models.UserDetails InsertUserDetails { get; set; }


}

模型

[Table("tblUsers")]
public class Users
{   
    [Key]
    public int Id { get; set; }

    [Remote("CheckUserName","Users",ErrorMessage="Fullname doesn't exists")]
    public string FullName { get; set; }
    public string LastName { get; set; }
}

动作

 public JsonResult CheckUserName(string FullName)
    {
        return Json(!db.Users.Any(x => x.FullName == FullName), JsonRequestBehavior.AllowGet);
    }

创建动作

 public ActionResult Create(VMUsers vmModel)
    {
        if (ModelState.IsValid)
        {
            CheckUserName(vmModel.InsertUser.FullName);

            var user = new Users()
            {
                FullName = vmModel.InsertUser.FullName,
                LastName = vmModel.InsertUser.LastName
            };
            //Inserting in Parent table to get the Id that we will used in Child table.
            db.Users.Add(user);
            db.SaveChanges();

        }

        return View(vmModel);
    }

现在我想查看现有记录,如果它存在,那么应该在View上显示一条错误消息,如果它应该插入一条新记录,我该如何一起做两件事。

查看

@model MVCLearning.Models.VMUsers

 @{
  ViewBag.Title = "Create";
  }

  <h2>Create</h2>

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

<div class="form-horizontal">
    <h4>Users</h4>
    <hr />
    @Html.ValidationSummary(true)

    @Html.ActionLink("Go to Index","index")
    <div class="form-group">
        @Html.LabelFor(model => model.InsertUser.FullName, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.InsertUser.FullName)
            @Html.ValidationMessageFor(model => model.InsertUser.FullName)
        </div>
    </div>

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

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

 <div>
     @Html.ActionLink("Back to List", "Index")
 </div>

2 个答案:

答案 0 :(得分:1)

如果用户存在于db。

中,您可以向ModelStateDictionary添加新错误

此外,您的视图看起来只发送FullName和LastName。在这种情况下,为什么不让视图模型只包含那些属性,以便视图特定视图模型不会与实体模型紧密耦合。

public class CreateUserVM
{
  [Required]
  public string FullName { set;get;}
  public string LastName { set;get;}
}

在您的GET操作中,请确保您发送的是此

的对象
public ActionResult Create()
{
  return View(new CreateUserVM());
}

您的视图将强烈输入我们的平面视图模型

@model CreateUserVM
@using(Html.BeginForm())
{
  @Html.ValidationSummary(false)

  <label>Full Name</label>
  @Html.TextBoxFor(s=>s.FullName)

  <label>Last Name</label>
  @Html.TextBoxFor(s=>s.LastName)

  <input type="submit" />
}

并且你的HttpPost动作方法将是

public ActionResult Create(CreateUserVM model)
{
    if (ModelState.IsValid)
    {
       var exist= db.Users.Any(x => x.FullName == model.FullName)
       if(exist)
       {
          ModelState.AddModelError(string.Empty, "Username exists");
          return View(vmModel);
       }

        var user = new Users()
        {
            FullName = model.FullName,
            LastName = model.LastName
        };
        //Inserting in Parent table to get the Id that we will used in Child table.
        db.Users.Add(user);
        db.SaveChanges();
        return ReidrectToAction("Index"); //PRG pattern
    }
    return View(vmModel);
}

答案 1 :(得分:1)

您的[Remote]属性不起作用,因为您使用

生成输入
<input type="text" name="InsertUser.FullName" .... >

但是将其发布到带有参数string FullName的方法。解决此问题的一种方法是使用[Bind]属性去除前缀

public JsonResult CheckUserName([Bind(Prefix="InsertUser")]string FullName)

因此值正确绑定。但是,更好的方法是使用仅包含视图中所需属性的视图模型,从您显示的视图中看起来只显示FullNameLastName,并避免使用{{1属性。

您的POST方法还包括对[Bind]的调用,该调用返回CheckUserName(vmModel.InsertUser.FullName);,这是没有意义的。假设您希望同时进行客户端远程验证,并在提交时进行重复检查,那么您应该将代码重构为2种方法

JsonResult

然后在POST方法中

private bool IsNameValid(string FullName)
{
    return Json(!db.Users.Any(x => x.FullName == FullName), JsonRequestBehavior.AllowGet);
}

public JsonResult CheckUserName(string FullName)
{
    return Json(IsNameValid(FullName), JsonRequestBehavior.AllowGet);
}