我一直在通過MVC 4項目中的ajax請求提交表單時難以獲得不顯眼的驗證。作爲參考,個人本主題是做幾乎我在做同樣的事情:MVC使用jQuery進行手動表單驗證總是返回True
Manual form validation in MVC 3 and JQuery
通過我做了什麼裏去了,但我仍然無法得到它的工作。問題是,當我做$(「#Form」)。valid()時,它總是返回true,即使我發送請求,模型也是無效的。我在我的捆綁包中設置了適當的腳本,但我無法使表單正確驗證客戶端。我怎樣才能使這個驗證正確?我認爲,一旦數據註釋建立起來了,它就「只應該工作」,但顯然在這裏並不是這樣。
此外,這個特殊的窗體也在部分視圖中的Kendo UI窗口中加載了jQuery。在查看這篇文章的答案後:Asp MVC unobtrusive Client Validation always returning true使用表單id作爲選擇器,.valid()仍然返回true,但Class Name爲false。但是,guid學期id返回true。
我的代碼如下:
型號
public class Class
{
public Class()
{
ClassId = Guid.NewGuid();
}
[Key]
public Guid ClassId { get; set; }
[Display(Name = "Class Name")]
[Required(ErrorMessage = "A Class Name is required.")]
public string ClassName { get; set; }
public int UserId { get; set; }
[Display(Name = "Term Type")]
[Required(ErrorMessage = "The Term Type is required.")]
public Guid SemesterId { get; set; }
[ForeignKey("SemesterId")]
public virtual Semester Semester { get; set; }
[Display(Name = "Class Year")]
public int Year { get; set; }
[Display(Name = "Has Weighted Grades?")]
public bool HasWeightedGrades { get; set; }
public virtual List<Grade> Grades { get; set; }
}
形式
@using (Html.BeginForm("AddClass", "", FormMethod.Post, new { name = "AddNewClassForm", id = "AddNewClassForm" }))
{
<div>
<div>@Html.LabelFor(m => m.ClassName)</div>
<div>
@Html.TextBoxFor(m => m.ClassName, new { @class = "input-xlarge" })
@Html.ValidationMessageFor(m => m.ClassName)
</div>
<div>@Html.LabelFor(m => m.SemesterId)</div>
<div>
@Html.DropDownList("SemesterId", null, "-- Select a Term Type --", new { @class = "input-xlarge" })
@Html.ValidationMessageFor(m => m.SemesterId)
</div>
</div>
}
<div>
<button id="AddClassButton" class="btn btn-primary" type="submit"><i class="icon-plus icon-white"></i> Add Class</button>
<button id="CancelAddClassButton" class="btn btn-danger" type="submit"><i class="icon-ban-circle icon-white"></i> Cancel</button>
</div>
jQuery的事件
//================================================================================================================================
// AddClassButton: Click event handlers.
//================================================================================================================================
$('#AddClassButton').unbind('click').bind('click', function (e) {
$.validator.unobtrusive.parse($('#AddClassWindow'));
var val = $("#AddNewClassForm").validate();
val.showErrors();
alert("Is the form valid? " + val.valid()); //Always returns true
alert("Is Class Name Valid? " + $("#ClassName").valid()); //Still returns true
alert("Is Semester Id Valid? " + $("#SemesterId").valid()); //Still returns true
e.preventDefault(); // Prevent this from doing default (possibly submit form).
e.stopPropagation(); // Prevent infinite loop.
});
個
捆綁
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.unobtrusive*",
"~/Scripts/jquery.validate*"));
//Ignoring these so only the min.js versions get rendered
bundles.IgnoreList.Ignore("jquery.validate.js");
bundles.IgnoreList.Ignore("jquery.validate.unobtrusive.js");
bundles.IgnoreList.Ignore("jquery.unobtrusive-ajax.js");
控制器動作
[Authorize]
public ActionResult AddClass()
{
var userName = User.Identity.Name;
var userProfile = db.UserProfiles.SingleOrDefault(x => x.UserName == userName);
InitializeSemesters();
InitializeYears();
return PartialView(new Class() { UserId = userProfile.UserId, Year = DateTime.Now.Year });
}
顯然你發佈的代碼與你正在使用的代碼不一樣,你發佈的類中沒有UserId,但是你在剃鬚刀代碼中引用了它,如果你需要幫助,如果它太大,你需要簡化代碼併產生最簡單的工作集代碼來說明問題 –
我已經更新了代碼並刪除了UserId引用。模型,但它沒有被驗證,唯一被驗證的字段是列出的字段,如果我將它傳遞迴控制器,它將在服務器上正確驗證,而不是在客戶端。 –
這裏的問題是,代碼中有很多其他的東西,當你測試時,你也測試其他的東西,其他東西可能是問題的一部分,你需要給我們一個完整的工作例子e說明了這個問題。通過這個,我的意思是你已經驗證了你提供給我們的代碼中存在的問題。 –