我有一个奇怪的情况,我为我的实体对象创建了一个单独的验证类:
[MetadataType(typeof(TopTenFav_Validation))]
public partial class TopTenFav
{
}
public class TopTenFav_Validation
{
[Required(ErrorMessage = "Youtube link is Required")]
[StringLength(100, ErrorMessage="Youtube link cannot exceed 100 characters")]
[Range(10,20)]
public string YoutubeLink { get; set; }
[StringLength(100, ErrorMessage = "Youtube link cannot exceed 50 characters")]
[Required]
[MinLength(5, ErrorMessage = "Youtube link cannot be shorter than 30 characters")]
public string Title { get; set; }
}
实体对象的名称与我的验证类 - TopTenFav 相同,因此当我红色时,它应该自动将验证逻辑映射到我的实体框架对象。我有一个小表单,将文本框映射到模型,如下所示:
<div>
@Html.TextBoxFor(m => m.topTenFav.YoutubeLink, new { id = "youTubeLinkTxt" })
@Html.ValidationMessageFor(m => m.topTenFav.YoutubeLink,"*")
</div>
<div>
@Html.TextBoxFor(m => m.topTenFav.Title, new { id = "youTubeNameTxt" })
@Html.ValidationMessageFor(m => m.topTenFav.Title,"*")
</div>
问题是 required 属性在其他属性工作时不起作用,这意味着当我将文本框留空并对服务器进行 ajax 调用时,代码会成功传递,但当我输入未通过 minLenght 验证器的数据时,代码按照我的预期转到我的 ajax 调用的错误部分。那么,当我的文本框为空时,所需的验证器不会启动,我在这里错过了什么?
$(document).on("click", ".btnAddTopTenFav", function () {
var btnClicked = $(this);
var txtLink = $('#youTubeLinkTxt').val();
var txtName = $('#youTubeNameTxt').val();
var subLink = txtLink.substr(31); //.replace(/.*\?v=/, '');
var rank = $(this).parent().index() + 1;
$("#hiddenRank").val(rank);
$.ajax({
beforeSend: function () { ShowAjaxLoader(); },
url: "/Home/AddTopTenFav/",
type: "POST",
data: $("#AddTopTenFavForm").serialize(),
success: function (data) { HideAjaxLoader(), ShowMsg("Song Added Successfully"), $(btnClicked).replaceWith('<a name="' + subLink + '" class="savedLinks" href="#" >' + txtName + '</a><span name=' + data + ' class="btnDeleteTopTenFavSong dontDoAnything">x</span'); },
error: function () { HideAjaxLoader(), ShowMsg("Song could not be added, please try again") }
});
[HttpPost]
public ActionResult AddTopTenFav(HomeViewModel topTen)
{
if (ModelState.IsValid)
{
var top = new TopTenFav();
top.Date = DateTime.Now;
top.Rank = topTen.topTenFav.Rank;
top.UserName = User.Identity.Name;
top.YoutubeLink = topTen.topTenFav.YoutubeLink;
top.Title = topTen.topTenFav.Title;
repository.AddTopTen(top);
repository.Save();
return this.Content(top.SongId.ToString());
}
else
{
return View();
}