Model view controller 使用RemoteAttribute时,参数始终为空

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

我正在尝试在MVC中进行我的第一次远程验证,由于验证操作接收的参数始终为空,因此我无法进行远程验证

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; }
}