我使用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>
答案 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)
因此值正确绑定。但是,更好的方法是使用仅包含视图中所需属性的视图模型,从您显示的视图中看起来只显示FullName
和LastName
,并避免使用{{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);
}