【问题标题】:MVC 5 IValidatableObject not displaying error message?MVC 5 IValidatableObject 不显示错误消息?
【发布时间】:2014-07-07 10:51:03
【问题描述】:

我正在关注 ScottGus 博客 here - 我的基本要求是我在屏幕上有两个文本字段 - 我想验证它们是否都是空白的并且按下了 Sumite 按钮我想显示以使用那个或者其他是必需的

我有一个 UserModel 如下:

public class UserViewModel : IValidatableObject
{
    [Display(Name = "Name:")]
    public string UserName { get; set; }

    [Display(Name = "User Account Number:")]
    public string UserAccountNumber { get; set; }

    public bool UserHasName()
    {
        return !string.IsNullOrEmpty(UserName);
    }

    public bool UserHasAccountNumber()
    {
        return !string.IsNullOrEmpty(UserAccountNumber);
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!UserHasName() && !UserHasAccountNumber())
        {
            yield return new ValidationResult("Please enter an Account Number or Name ", new [] {"UserName"});
        }
    }
}

在我看来,我有:

  @Html.TextBoxFor(m => m.UserName, new { @class = "form-control", @placeholder = "UserName" })
                    @Html.ValidationMessageFor(m => m.UserName)

在 Webconfig 中,我有以下内容:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

但是,当我在两个字段都为空白的情况下点击提交按钮时,屏幕上没有显示错误消息?

更新

在 Bundle 配置中,我也在使用 jQuery.validate.unobtrusive:

 bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js",
                        "~/Scripts/jquery.validate.js",
                        "~/Scripts/jquery.validate.unobtrusive.js"));

虽然之后我为 bootstrap 和 kendo ui 添加了 js - 这会导致一些冲突吗?

更新了两个

控制器代码:

public ActionResult UserDetails()
    {
        if (ModelState.IsValid)
        {
            // IsValid is true so code goes in here when text fields are blank??
            //redirect to another view
        }

        return View();
    }

我确实有一个 JsonValididationFilterAttribute 类 - 代码如下 - 虽然我说出于某种原因 Validate 上的断点或这个 OnActionExecuting 没有被命中?

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ModelState.IsValid) return;
        var errorMessages = actionContext.ModelState.Values
            .SelectMany(modelState => modelState.Errors);
        actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, Json.Encode(errorMessages));
    }

【问题讨论】:

  • 你在控制器中检查你的模型(ModelState.IsValid)吗?
  • @idlerboris - 是的,我检查了 ModelState.IsValid - 但是在提交带有空白字段的表单时,IsValid 为真,而且如果我在 ViewModel 的验证方法中设置了断点,它不会被命中?
  • 你能附上你的控制器代码吗?
  • 您使用的是自定义模型绑定器吗?
  • @idlerboris - 问题再次更新

标签: c# .net asp.net-mvc validation asp.net-mvc-5


【解决方案1】:

我认为您应该在您的操作方法中插入参数,如下所示:

public ActionResult UserDetails(UserViewModel model)

否则,MVC 不明白,您要在此模型上调用 Validate。

【讨论】:

    【解决方案2】:

    您可能需要一些额外的 javascript:

    包含 jquery.unobtrusive-ajax.js 文件。

    <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
    

    您可以在 NuGet 包中找到它:Microsoft.jQuery.Unobtrusive.Ajax。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2012-04-28
      • 2014-09-23
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2017-01-06
      • 2018-07-07
      • 2014-10-17
      相关资源
      最近更新 更多