MVC DB复制检查,编辑时出现问题

时间:2015-03-10 11:58:52

标签: model-view-controller username editing duplication

创建条目时,我必须对数据进行某种重复检查(比方说用户名)。我是这样做的。 (它在VB中,但不要打扰)

  

在控制器中:

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
  

并在模型中:

<Remote("CheckForDuplication", "User", HttpMethod:="POST", ErrorMessage:="username not available")>
Public Property Username As String
  

并在视图中使用标准JS验证库。

创作时,它真的很好......问题是,在编辑时,您无法保存相同的用户名,因为它被禁止是客户端验证...因为它已经存在于DB中。对于当前用户名&#39;如何对验证进行过度验证?但留给别人。或者应该使用自定义JS重做并从模型中删除[remote]。谢谢

1 个答案:

答案 0 :(得分:0)

我自己找到了解决问题的方法。如果其他人需要,我会发布它。它不是很漂亮,但工作正常。 我所做的是,当我调用View编辑时,我传递了一个TempData [“name”]。当编辑字段并且JS调用CheckForDuplication方法时,我可以读取TempData [“name”]的内容(TempData似乎“幸存”从View返回到控制器方法,与ViewBag和ViewData不同)并且当检查重复时考虑到TempData [“name”]。问题是,首先检查TempData被擦除干净(寿命似乎是一个请求很长)所以....我还将ViewBag.name传递给View并制作了一个JS脚本,它调用一个重新设置TempData的方法[具有ViewBag.name值的“name”](因为TempData [“name”]只能设置为服务器端)

  

控制器

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
  

查看

<script type="text/javascript">

function ResetTempData() {
    var url = "/User/SetTempData";
    var TDname = "@ViewBag.UserName"
    $.post(url, { name: TDname});
};

$('#UserName').change(ResetTempData);
</script>

看起来很奇怪,但有效。我希望它对某人来说很方便