【问题标题】:How can I pass JavaScript errors from an action to my view?如何将 JavaScript 错误从操作传递到我的视图?
【发布时间】:2010-11-06 16:42:13
【问题描述】:

我有 2 个操作,一个用于 GET,另一个用于处理 POST 请求。

虽然我在客户端进行了验证,但我也在服务器端检查了一些内容(在我的操作方法中)。

在 POST 操作中,当我发现要向 UI 报告的错误等时,我必须通过哪些选项将消息/错误发送回客户端?


注意:

我正在使用流行的 jQuery 验证插件 als。

【问题讨论】:

    标签: c# javascript jquery asp.net-mvc error-handling


    【解决方案1】:

    在 Web 应用程序/网站中实现验证时遵循的一些规则:

    • 验证应在客户端和服务器端进行
    • 对于关闭脚本的用户,服务器端验证应反映客户端验证
    • 尽管验证规则在两个地方强制执行,但逻辑不应重复

    按照这些规则,我使用以下解决方案:

    • xVal(来自 ScottGu 的博客)
    • IDataError solution 来自亚当 施罗德
    • 业务规则通过 DataAnnotations 在模型中实现
    • 服务可能会针对独特的业务约束抛出自定义异常

    令人惊讶的是,它的易用性和效果如何。它透明地使用 JQuery 验证插件,并且只用最少的编码完成它应该做的事情。

    您认为客户端验证包括:

    <%= Html.ClientSideValidation<Foo>() %>
    

    您操作中的服务器端验证包括

    ModelState.IsValid
    

    【讨论】:

      【解决方案2】:

      我正在使用从视图到发布操作的模型绑定,它具有可用于此的内置验证。

      然而,有些人更喜欢在模型之外进行验证。要将这些错误返回给 View,您需要更新 ModelState,然后正常检查它是否有效(包含错误):

          public Dictionary<string, string> ValidateEntry(Object obj)
          {
              var errors = new Dictionary<string, string>();
      
              if (string.IsNullOrEmpty(obj.Owner))
              {
                  errors.Add("Owner", "You must select Owned By.");
              }
              //... whatever else
              return errors;
          }
      
           [AcceptVerbs(HttpVerbs.Post)]
          public ActionResult Edit(Object cap)
          {
             var errors = ValidateEntry(cap);
              if (errors.Count > 0)
              {
                  foreach (var err in errors)
                  {
                      ModelState.AddModelError(err.Key, err.Value);
                  }
              }
              if (ModelState.IsValid)
              {
                 //... do if valid
              }
              return View(ViewModel);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-13
        • 1970-01-01
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        相关资源
        最近更新 更多