【问题标题】:remote validation in mvc affected editmvc 中的远程验证受影响的编辑
【发布时间】:2015-01-29 15:27:30
【问题描述】:

我试图通过客户端的远程验证来验证用户名,并且在创建模块中添加重复字段时它工作正常但现在它不允许我使用相同的名称编辑记录它向我显示相同的错误我为创建定义的。我尝试了所有可能的方法,但没有成功,请帮助我。我已经关注了这些链接,但它不能以任何一种方式工作。

http://stackoverflow.com/questions/4778151/asp-net-mvc-3-remote-validation-to-allow-original-value http://stackoverflow.com/questions/6407096/asp-net-mvc-3-remote-attribute-passing-3-fields

这是我迄今为止尝试过的代码。请帮助专家。

[Required]
        [Remote("IsUserAvailable", "User", HttpMethod = "Post", ErrorMessage = "User already exist.", AdditionalFields = "InitialUserName")]
        [RegularExpression(@"^(?![\W_]+$)(?!\d+$)[a-zA-Z0-9 ]+$", ErrorMessage = "Invalid UserName ")]
 public string UserName { get; set; }


[HttpPost]
    public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, string initialUserName)
    {

        var result = uDbContext.Users.FirstOrDefault(a => a.UserName == UserName);
        if (result == null)
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }
        return Json(JsonRequestBehavior.AllowGet);
    }


@model User.ViewModel.ViewModelUser
@using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        @Html.HiddenFor(m => m.User.UserId)



                @Html.LabelFor(m.User.UserName)


               @Html.TextBoxFor(m => m.User.UserName)
                @Html.ValidationMessageFor(m.User.UserName)
                @Html.Hidden("initialUserName", Model.User)
            </div>
        </div>
}

请帮助专家完成我的任务。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 validation


    【解决方案1】:

    User 似乎是一个复杂的对象,所以

    @Html.Hidden("initialUserName", Model.User)
    

    可能会产生类似的东西

    <input type="hidden" name="initialUserName" value="YourAssemly.User" ... />
    

    这对验证没有帮助。

    您可以通过使用发送回原始名称来忽略验证

    @Html.Hidden("InitialUserName", Model.User.UserName)
    @Html.Hidden("User.InitialUserName", Model.User.UserName)
    

    然后使用比较控制器中的值

    public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, string initialUserName)
    public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, [Bind(Prefix = "User.InitialUserName")]string initialUserName)
    {
      if (UserName == initialUserName)
      {
        // Nothing has changed so signal its valid
        return Json(true, JsonRequestBehavior.AllowGet);
      }
      // Check if the user name already exists
      var result = uDbContext.Users.FirstOrDefault(a => a.UserName == UserName);
      return Json(result == null, JsonRequestBehavior.AllowGet);
    }
    

    旁注:jquery 远程验证是一个 GET 调用,因此不需要 [HttpPost] 属性

    编辑

    在调试jquery-validate.jsjquery-validate-unobtrusive.js 文件后,发现任何AdditionalFields 的name 属性必须包含与正在验证的属性相同的前缀,并且[Bind(Prefix="..")] 属性也是必需的方法中的那些参数(参考上面的修改)

    另一种方法可能是创建一个简单的类来回发,例如

    public class ValidateUserNameVM
    {
      public string UserName { get; set; }
      public string InitialUserName { get; set; }
    }
    

    public JsonResult IsUserAvailable([Bind(Prefix = "User")]ValidateUserNameVM model)
    {
      if (model.UserName == model.InitialUserName)
      ....
    

    【讨论】:

    • 编辑仍然出现同样的错误,它不允许我编辑记录
    • 然后还有其他事情发生。你是什​​么意思它不允许我编辑记录?一个远程属性只会在验证失败时给你一个错误消息——它不会阻止你编辑它
    • 您是否检查过UserNameInitialUserName 的值是否正确且符合预期?
    • 我得到了 userName = steve 和 initialUserName = null 的值,并且在编辑它时只是给我验证错误消息用户已经存在。
    • 检查由@Html.Hidden("initialUserName", Model.User.UserName)生成的html如果初始用户名是“steve”那么它应该是&lt;input type="hidden" name="initialUserName" value="steve" ... /&gt;应该回发。如果没问题,请将其更改为 TextBoxFor() 以测试是否有效。
    【解决方案2】:

    您的验证功能不完整。将[Required] 属性放在模型的UserName 属性上,然后试试这个:

    public JsonResult IsUserAvailable(string userName, string initialUserName)
    {
       if (userName.Trim().ToLower() != (initialUserName ?? "").Trim().ToLower())
       {
           var result = YourMethodToCheckTheDatabaseForUsernameIsAvailable(userName);
           return Json(result, JsonRequestBehavior.AllowGet);
       }
       return Json(true, JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

    • 感谢您的快速响应,但我在这段代码中遇到了错误.... if(userName.Trim().ToLower() != initialUserName.Trim().ToLower() )
    • 在不知道错误的情况下我只能猜测... initialUserName 是否为空?
    • 是的,错误是对象引用未设置为对象的实例。我得到空值
    • 感谢您对@joelmdev 的关注,但现在它的错误运算符不同了??不能应用于操作数 bool 和 string 。
    • @Miranda 再次编辑,这次我实际上用 VS 检查了有效性。你应该明白最后一个错误是一个优先问题,很容易调试。
    【解决方案3】:

    对于在第二个参数中获取 Null 的人来说,这个简单的想法可能会有所帮助

    public JsonResult IsUserNameAvailable(string Name, string EditNameIssue)
            {//it will return true if match found elese it will return false. so i add !
                if (Name == EditNameIssue)
                {
                    return Json(true, JsonRequestBehavior.AllowGet);
                }
                else
                {
                    return Json(!db.Employees.Any(e => e.Name == Name), JsonRequestBehavior.AllowGet);
                }
            }
    

    转到班级并将string EditNameIssue 添加到班级,以便可以将其发送到控制器

    [MetadataType(typeof(EmployeeMetaData))]
        public partial class Employee
        {
    
            public string EditNameIssue { get; set; }
        }
    

    并编辑 Remote 属性以发送此附加属性

    [Remote("IsUserNameAvailable","Employees",ErrorMessage ="User Name Already Taken",AdditionalFields = "EditNameIssue")]
            public string Name { get; set; }
    

    如果您添加名称以编辑已被占用的文本框,此逻辑可能会有所帮助

    public JsonResult IsUserNameAvailable(string Name, string EditNameIssue)
        {//it will return true if match found elese it will return false. so i add !
            //Edit Request  
            if (Name == EditNameIssue)
            {
                //this mean he didn't change the name
                return Json(true, JsonRequestBehavior.AllowGet);
            }
            else if (Name != EditNameIssue)
            {
                //if he change the name in the edit go and check if the new name exist 
                //note if he modify and reenter it origin name it will be also erro he has to reload
                return Json(!db.Employees.Any(e => e.Name == Name), JsonRequestBehavior.AllowGet);
            }
            else if (string.IsNullOrEmpty(EditNameIssue))
            {//this mean you came from create request as there is no EditNameIssue in this view
    
                return Json(!db.Employees.Any(e => e.Name == Name), JsonRequestBehavior.AllowGet);
    
            }
            else
            {//just for the completeness
                return Json(false, JsonRequestBehavior.AllowGet);
            }
    
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多