簡體   English   中英

在沒有View表單的ASP.NET MVC中使用遠程驗證

[英]Use Remote validation in ASP.NET MVC without form on View

我在ASP.NET MVC 4應用程序的ViewModel上使用Remote屬性。 這是我的簡單模型:

public class User
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "test test")]
    public int Id { get; set; }

    [DisplayName("Email")]
    [Remote("RemoteValidateEmailLengthValidation", "Home")]

    public string Email { get; set; }
}

和遠程驗證方法:

public JsonResult RemoteValidateEmailLengthValidation(string Email)
{
    if (Email.Length > 20)
    {
        return Json("Too long email", JsonRequestBehavior.AllowGet);
    }
    else
    {
        return Json(true, JsonRequestBehavior.AllowGet);
    }
}

我在Layout上添加了驗證所需的所有腳本:

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryui")
@Scripts.Render("~/bundles/jqueryval")

WebConfig寫下驗證所需的全部內容:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

並添加創建空模型並返回View簡單Controller

@model ViewModels.User

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm("PostUser", "Home", FormMethod.Post))
{
    @Html.EditorForModel()
    <input type="submit" />
}

僅當我將模型包裝在form 它才起作用,而當我這樣編寫View 不起作用

@model ViewModels.User

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@Html.EditorForModel()

所以我有問題:

  1. 為什么沒有表單就無法進行遠程驗證? 因為在Chrome調試器中我看到該表單沒有提交,所以我僅看到了驗證方法調用。
  2. 遠程驗證使用哪種javascript方法? OnChange 我可以在任何地方看到它,也可以更改它嗎?

客戶端非侵入式驗證涉及

  1. 在服務器端:用於生成表單控件的所有HtmlHelper在內部都調用HtmlHelperGetUnobtrusiveValidationAttributes方法。 執行各種檢查,如果未滿足所有條件(例如,已禁用UnobtrusiveValidation),則不會呈現客戶端驗證所需的data-val屬性
  2. 在客戶端:加載jquery.validation.unobtrusive.js ,它首先檢查<form>標記的存在,然后基於data-val屬性,添加供jquery.validate使用的規則,消息等jquery.validate

第一個調用的函數是

parse: function (selector) {
    var $forms = $(selector)
        .parents("form")
        .andSelf()
        .add($(selector).find("form"))
        .filter("form");
    ....

其中selector是html文檔元素。 如果沒有<form>元素,則var $forms是未定義的,僅執行其他操作。 如果沒有<form>元素,則客戶端驗證根本無法工作。

目前尚不清楚為什么會生成不在表單中的html表單控件,但是您可以簡單地對控制器函數進行調用,返回一條消息並顯示它

public JsonResult RemoteValidateEmailLengthValidation(string Email)
{
    if (Email.Length > 20)
    {
        return Json("Too long email", JsonRequestBehavior.AllowGet);
    }
    else
    {
        return Json(null, JsonRequestBehavior.AllowGet);
    }
}

和腳本

var url = '@Url.Action("RemoteValidateEmailLengthValidation", "Home")';
var placeHolder = $('[data-valmsg-for="Email"]');
$('#Email').change(function() {
  $.getJSON(url, { Email: $(this.val() }, function(response) {
    if(response) {
      placeHolder.text(response).removeClass('field-validation-valid').addClass('field-validation-error');
    }
  });
});

並處理.keyup事件以刪除錯誤消息並重置類名

無法在ASPNET 5中找到JsonRequestBehavior

[HttpGet]
public JsonResult IsAllowedName(string FirstMidName)
{
    if (FirstMidName.ToLower() == "oleg")
    {

        //It seems that Microsoft.Asp.Net.Mvc does 
        //not contain JsonRequestBehavior enum
        return Json(false, JsonRequestBehavior.AllowGet); 
    }
    return Json(true);
}

終端輸出

dnu build
/.../Controllers/ValidationController.cs(20,24):
DNXCore,Version=v5.0 error CS0103: 
The name 'JsonRequestBehavior' does not exist in the current context
Build failed.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM