Model view controller 使用RemoteAttribute时,参数始终为空
我正在尝试在MVC中进行我的第一次远程验证,由于验证操作接收的参数始终为空,因此我无法进行远程验证Model view controller 使用RemoteAttribute时,参数始终为空,model-view-controller,data-annotations,Model View Controller,Data Annotations,我正在尝试在MVC中进行我的第一次远程验证,由于验证操作接收的参数始终为空,因此我无法进行远程验证 public class Book { [Remote("IsValidDate", "Validation")] public DateTime ReleaseDate { get; set; } } 然后我在Book类之外需要一些其他值,因此我还创建了一个BookModel: public class BookModel { public Book Book; public
public class Book
{
[Remote("IsValidDate", "Validation")]
public DateTime ReleaseDate { get; set; }
}
然后我在Book类之外需要一些其他值,因此我还创建了一个BookModel:
public class BookModel
{
public Book Book;
public string SomeOtherValueNotInterestingInThisExample;
public BookModel(Book book)
{
Book = book;
// other stuff
}
}
然后,我的编辑页面包含:
...
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
.... and later
<div class="editor-label">
@Html.LabelFor(model => model.Book.ReleaseDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Book.ReleaseDate)
@Html.ValidationMessageFor(model => model.Book.ReleaseDate)
</div>
我的问题是,IsValidDate(字符串strDate)中的strDate参数始终为空。显然,我的验证工作正常,如果我强制它失败,它也会将正确的errormessage返回到正确的字段
我不明白为什么strDate总是空的。是因为它在一个BookModel中,因此被称为“Book.ReleaseDate”?好的,在这种情况下,这里有一个适合我的方法。首先,我必须承认我不知道IsValidDate中的参数必须与我要验证的字段命名相同。我现在知道了 以下是更改后的代码:
public class ValidationController : Controller
{
public JsonResult IsValidDate(string date)
{
if (date == null)
date = GetQueryStringValue("date");
bool isValid = DateHelper.IsValid(date);
if (isValid)
{
return Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
private string GetQueryStringValue(string key)
{
return (from qStr in Request.QueryString.AllKeys
where qStr.ToLower().EndsWith(key.ToLower())
select Request.QueryString.Get(qStr)).FirstOrDefault();
}
}
请注意,我已经创建了一个单独的GetQueryStringValue,因此其他验证器可以使用相同的方法
我的Book类现在看起来像这样(这里只提到有问题的字段):
对解决方案的注释:基本上,我开始检查IsValidDate中的参数是否为null。如果为null,我将遍历所有QueryString键,查看是否有以所需字段名结尾的参数,然后用该值填充参数
这让我找到了另一个解决方案(它只在这里起作用,因为我知道我没有其他字段以相同的字段名结尾,或者应该说,部分字段名结尾)。通过说我只想查看部分键名称“date”(而不是“releasedate”),我可以让这个验证器检查视图中的所有日期字段。但如前所述:它只起作用,因为我不想在远程验证中使用其他字段。如果我想比较例如“StartDate”和“ReleaseDate”,我会遇到问题:-)
我还将ErrorMessage移动到了DataAnnotations,因此可以在字段上显示不同的errormessages
这不太好,但很管用 如果我添加:strDate=Request.QueryString[“Book.ReleaseDate”];在“bool isValid=DateHalper…”前面,然后我得到正确的结果。。。有没有什么方法可以让我的控制器接收日期作为strDate,而不是这个hack?我想能够重用这个IsValidDate控制器与其他变量以及。。。
public class ValidationController : Controller
{
public JsonResult IsValidDate(string date)
{
if (date == null)
date = GetQueryStringValue("date");
bool isValid = DateHelper.IsValid(date);
if (isValid)
{
return Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
private string GetQueryStringValue(string key)
{
return (from qStr in Request.QueryString.AllKeys
where qStr.ToLower().EndsWith(key.ToLower())
select Request.QueryString.Get(qStr)).FirstOrDefault();
}
}
public class Book
{
[Remote("IsValidDate", "Validation", ErrorMessage = "Release date is not valid")]
public DateTime ReleaseDate { get; set; }
[Remote("IsValidDate", "Validation", ErrorMessage = "Start date is not valid")]
public DateTime StartDate { get; set; }
}