【问题标题】:Remote validation restrict for edit controller method编辑控制器方法的远程验证限制
【发布时间】:2018-09-04 21:43:49
【问题描述】:

我有注册模型

我的模型类

public class RegisterViewModel
{


    [Required]
    [StringLength(100, ErrorMessage = "Please enter a minimum of {2} characters", MinimumLength = 6)]
    [DisplayName("University ID")]
    [Remote("doesusernameExist", "HEC",null, ErrorMessage = "usr name is allready exist", HttpMethod = "POST")]
    public string usrname { get; set; }    }

我的 json 控制器类

 [HttpPost]
    public JsonResult doesusernameExist(string usrname)
    {

         var institute = db.Institutes.Find(HEI_ID);
                   return Json(institute == null);


    }

用于创建新用户和编辑用户,我正在使用上述模型。所以在不创建另一个模型的情况下,我想在编辑方法中禁用 dosusernameExist 调用方法

【问题讨论】:

  • 您需要 2 个视图模型(最佳解决方案),或者您需要使用 RemoteAttributeAdditionalFields 属性将附加值传递给 doesusernameExist() 方法(例如 ID 属性)所以您可以使用它来有条件地测试是否需要执行数据库检查(即,如果 ID 为 null 或为零,则它是一个新对象,所以 return Json(true); 或您要应用的任何逻辑)

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


【解决方案1】:

首先在View as中添加一个隐藏字段:

@Html.hidden("PreviousUsername", Model.usrname)

在您的 .cs 类中添加以下内容:

[Remote("doesusernameExist", "HEC", ErrorMessage = "usr name is allready exist", AdditionalFields = "PreviousUsername")]
public string usrname { get; set; }

你的控制器动作方法应该是这样的:

public JsonResult doesusernameExist(string usrname, string PreviousUsername)
{

     if(usrname==PreviousUsername)
     {
       return true;
     }
     var institute = db.Institutes.Find(HEI_ID);
     return Json(false, JsonAlloBehaviour.AllowGet);

}

【讨论】:

  • 这对我来说效果很好,因为我有一个表格可以同时进行新建和编辑。
【解决方案2】:

首先在编辑视图中禁用username 的客户端验证:

@Html.TextBoxFor(m => m.username, new { @data_val = "false" })

Edit Post Action 中的第二个从ModelState 中删除username 的验证结果:

public ActionResult EditUser([Bind(Exclude = "usrname")]RegisterViewModel model)
{
    ModelState.Remove("username");
    if (ModelState.IsValid)
    {
    .
    .
    .

【讨论】:

  • 这会删除所有验证,包括 [Required][StringLength] 验证!
  • 当然它会删除所有验证,但在Edit User Action 中不需要检查用户名,因为它已经存在并且用户无法更改他/她的用户名。很明显,不是吗?
  • 您已经显示了一个文本框,以便用户可以对其进行编辑。所以用户清除文本框的内容或者编辑成100多个字符或者编辑成和其他一些用户的'username'一样,都是无效但不会被拾取。
  • 如果仔细看答案[Bind(Exclude = "usrname")]解决这个问题。
猜你喜欢
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2018-11-07
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多