MVC DB 重复检查,编辑时出现问题
MVC DB Duplication check, trouble when editing
我在创建条目(比如用户名)时必须对数据进行某种重复检查。我是这样做的。 (它在 VB,但不要打扰)
In controller:
Function CheckForDuplication(ByVal UserName As String) As JsonResult
If db.Users.Count(Function(x) x.Username.ToLower() = UserName.ToLower()) > 0 Then
Return Json(False, JsonRequestBehavior.AllowGet)
Else
Return Json(True, JsonRequestBehavior.AllowGet)
End If
End Function
and in model:
<Remote("CheckForDuplication", "User", HttpMethod:="POST", ErrorMessage:="username not available")>
Public Property Username As String
and using standard JS validation libraries in view.
它工作得很好......在创建时。问题是在编辑时你不能保存相同的用户名,因为客户端验证被禁止..因为它已经存在于数据库中。如何为当前 'username' 过度通过验证,但为其他人保留。或者应该使用自定义 JS 重做并从模型中删除 [remote]。谢谢
我自己找到了解决问题的办法。如果有人需要,我会post。它不是很漂亮,但工作正常。
我所做的是,当我调用视图进行编辑时,我传递了一个 TempData["name"]。当编辑字段并且 JS 调用 CheckForDuplication 方法时,我可以读取 TempData["name"] 的内容(TempData 似乎 'survive' 从 View 转换回控制器方法,不像 ViewBag 和 ViewData)并且当考虑到 TempData["name"] 进行重复检查。问题是在第一次检查中 TempData 被清除干净(寿命似乎是一个请求长)所以......我还向视图传递了一个 ViewBag.name 并制作了一个 JS 脚本,它调用一个重新设置的方法TempData["name"] 的值为 ViewBag.name(因为 TempData["name"] 只能在服务器端设置)
Controller
Public Function Edit(UserId As Integer) As ViewResult
Dim user As User= context.User.Find(UserId)
ViewBag.UserName = user.UserName
TempData("UserName") = user.UserName
Return View(user)
End Function
'''''''''''
Function CheckForDuplicationUserName(ByVal UserName As String) As JsonResult
If context.User.Count(Function(x) x.UserName.ToLower() = UserName.ToLower()) = 0 Then
Return Json(True, JsonRequestBehavior.AllowGet)
ElseIf TempData("UserName") Is Nothing Then
Return Json(False, JsonRequestBehavior.AllowGet)
ElseIf TempData("UserName").ToString().ToLower() = UserName.ToLower() Then
Return Json(True, JsonRequestBehavior.AllowGet)
Else : Return Json(False, JsonRequestBehavior.AllowGet)
End If
End Function
''''''''''
<HttpPost>
<AllowAnonymous>
Function SetTempData(ByVal name As String)
TempData("UserName") = name
End Function
View
<script type="text/javascript">
function ResetTempData() {
var url = "/User/SetTempData";
var TDname = "@ViewBag.UserName"
$.post(url, { name: TDname});
};
$('#UserName').change(ResetTempData);
</script>
看起来很奇怪但是很管用。我希望它对某人有用
我在创建条目(比如用户名)时必须对数据进行某种重复检查。我是这样做的。 (它在 VB,但不要打扰)
In controller:
Function CheckForDuplication(ByVal UserName As String) As JsonResult
If db.Users.Count(Function(x) x.Username.ToLower() = UserName.ToLower()) > 0 Then
Return Json(False, JsonRequestBehavior.AllowGet)
Else
Return Json(True, JsonRequestBehavior.AllowGet)
End If
End Function
and in model:
<Remote("CheckForDuplication", "User", HttpMethod:="POST", ErrorMessage:="username not available")>
Public Property Username As String
and using standard JS validation libraries in view.
它工作得很好......在创建时。问题是在编辑时你不能保存相同的用户名,因为客户端验证被禁止..因为它已经存在于数据库中。如何为当前 'username' 过度通过验证,但为其他人保留。或者应该使用自定义 JS 重做并从模型中删除 [remote]。谢谢
我自己找到了解决问题的办法。如果有人需要,我会post。它不是很漂亮,但工作正常。 我所做的是,当我调用视图进行编辑时,我传递了一个 TempData["name"]。当编辑字段并且 JS 调用 CheckForDuplication 方法时,我可以读取 TempData["name"] 的内容(TempData 似乎 'survive' 从 View 转换回控制器方法,不像 ViewBag 和 ViewData)并且当考虑到 TempData["name"] 进行重复检查。问题是在第一次检查中 TempData 被清除干净(寿命似乎是一个请求长)所以......我还向视图传递了一个 ViewBag.name 并制作了一个 JS 脚本,它调用一个重新设置的方法TempData["name"] 的值为 ViewBag.name(因为 TempData["name"] 只能在服务器端设置)
Controller
Public Function Edit(UserId As Integer) As ViewResult
Dim user As User= context.User.Find(UserId)
ViewBag.UserName = user.UserName
TempData("UserName") = user.UserName
Return View(user)
End Function
'''''''''''
Function CheckForDuplicationUserName(ByVal UserName As String) As JsonResult
If context.User.Count(Function(x) x.UserName.ToLower() = UserName.ToLower()) = 0 Then
Return Json(True, JsonRequestBehavior.AllowGet)
ElseIf TempData("UserName") Is Nothing Then
Return Json(False, JsonRequestBehavior.AllowGet)
ElseIf TempData("UserName").ToString().ToLower() = UserName.ToLower() Then
Return Json(True, JsonRequestBehavior.AllowGet)
Else : Return Json(False, JsonRequestBehavior.AllowGet)
End If
End Function
''''''''''
<HttpPost>
<AllowAnonymous>
Function SetTempData(ByVal name As String)
TempData("UserName") = name
End Function
View
<script type="text/javascript">
function ResetTempData() {
var url = "/User/SetTempData";
var TDname = "@ViewBag.UserName"
$.post(url, { name: TDname});
};
$('#UserName').change(ResetTempData);
</script>
看起来很奇怪但是很管用。我希望它对某人有用