2015-05-06 49 views
1

我在我的ViewModel中使用Remote屬性ASP.NET MVC 4應用程序。這是我簡單的模型:在ASP.NET MVC中使用遠程驗證,無窗體查看

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" /> 

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

@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?我可以在任何地方看到它嗎?我可以改變它嗎?
+0

嘗試取出''@當它是'using'子句 – jbutler483

+0

的'數據-val- *內'的jQuery unobtrusve驗證的必要的屬性不除非在表單內生成html助手,否則該方法將永遠不會被調用(這是設計)。你爲什麼要改變方法? –

+0

@ jbutler483你不明白。 **它使用表單工作**。但是,如果View上沒有任何表單,則不會觸發。我認爲這應該是腳本問題,但我不知道爲什麼。 –

回答

1

客戶端側不顯眼的驗證涉及

  1. 在服務器端:用於生成形式所有的HtmlHelper控制 內部調用GetUnobtrusiveValidationAttributes方法的HtmlHelper 。各種檢查被執行,並且如果不是所有 條件被滿足(例如UnobtrusiveValidation已被禁用) 則data-val屬性necesary爲客戶端驗證 不會呈現
  2. 在客戶端:當jquery.validation.unobtrusive.js是 加載時,它首先檢查是否存在<form>標記,然後 基於data-val屬性,爲 添加規則,消息等,使用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活動,刪除錯誤信息並重置類名

0

廣東話在aspne找到JsonRequestBehavior噸5

[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.