【问题标题】:MVC DB Duplication check, trouble when editingMVC DB重复检查,编辑时出现问题
【发布时间】:2015-03-10 11:58:52
【问题描述】:

在创建条目(比如说用户名)时,我必须对数据进行某种重复检查。我是这样做的。 (它在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 中。当前的“用户名”如何通过验证但其他人仍然存在。或者应该使用自定义 JS 重做并从模型中删除 [remote]。谢谢

【问题讨论】:

    标签: model-view-controller editing duplication


    【解决方案1】:

    我自己找到了解决问题的方法。如果其他人需要它,我会发布它。它不是很漂亮,但工作正常。 我所做的是,当我调用视图进行编辑时,我传递了一个 TempData [“name”]。当编辑字段并且 JS 调用 CheckForDuplication 方法时,我可以读取 TempData["name"] 的内容(TempData 似乎“幸存”了从 View 到控制器方法的转换,与 ViewBag 和 ViewData 不同)并且当检查重复时考虑到 TempData["name"]。问题是,在第一次检查中,TempData 被擦除干净(寿命似乎是一个请求长)所以....我还将 ViewBag.name 传递给 View 并制作了一个 JS 脚本,该脚本调用了一个重新设置 TempData [ "name"] 与 ViewBag.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>
    

    看起来很奇怪但很有效。我希望它对某人有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2014-02-02
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多