【问题标题】:MVC Form Validation failed due to two required fields with unused oneMVC 表单验证因两个必填字段而未使用而失败
【发布时间】:2017-01-14 00:36:06
【问题描述】:

我正在使用 MVC ViewModel。有两个单选按钮 是或否的形式。如果用户选择“是”,将显示 TextField1,如果选择“否”,将显示 TextField2。两者都是带有 *(星号)符号的必填字段。即使两者都是必填字段,用户也只能根据单选按钮选择一次填写一个 TextField。问题是当用户提交显示文本字段所需的验证错误消息之一时。有什么办法可以解决这个问题。

【问题讨论】:

  • 那么在您的模型中声明为Required 的两个字段是否作为DataAnnotation?
  • 是的。两者都是必填字段。
  • 那么你反对使用javascript吗?如果没有,为什么不从你的模型中去掉Required数据注释,然后在JS中检查是否选中了一个或另一个单选按钮,如果是,那么.attr("required")?
  • 我试过了,但是不行。
  • 是否有任何选项可以使用 javascript 更改所需属性的验证错误消息

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-validation


【解决方案1】:

如果您只显示一个,则不能同时要求两者。

解决此问题的最简单方法之一是使用视图模型比将 DTO 对象传递给页面的优势之一。

我需要在这里做很多假设,因为您没有提供任何代码,但您的问题很简单。即使我的假设不正确,这些原则也可以很容易地推断到您的特定用例中。

我将假设您的对象看起来像这样:

public class DtoObject
{
    public bool IsPositiveSelection { get; set; }
    public string YesReason { get; set; }
    public string NoReason { get; set; }
}

在不知道发生了什么的情况下,我认为您有充分的理由这样做。也许在一个中要求一个电子邮件地址,另一个是电话号码。

如果您还没有,您需要创建一个像这样的视图模型:

public class DtoObjectViewModel
{
    public bool YesNoRadio { get; set; }
    [Required]
    public string Reason { get; set; }
}

我在这里所做的不是制作两个单独的框,而是使用一个始终显示的框。如果您确实需要电子邮件验证和电话号码之类的东西,您可以使用 JavaScript 来应用它,而不仅仅是依赖于属性。

这将允许您确保该值始终存在,无论单选按钮处于哪种状态。

在某些时候,您需要将您的视图模型映射回您的 DTO 对象:

private DtoObject MapToDto(DoObjectViewModel model)
{
    return new DtoObject
    {
        IsPositiveSelection = model.YesNoRadio,
        YesReason = model.YesNoRadio ? model.Reason : "",
        NoReason = model.YesNoRadio ? "" : model.Reason
    };
}

还有很多其他选项,但这些选项需要更多的 JavaScript,并且使任何答案都比这个更广泛。

【讨论】:

  • 感谢您的快速更新。这似乎是最好的答案,而不是使用 javascript。但是当用户提交时,我想显示适当字段的验证错误消息。如果我只使用一个字段,我无法为未选择的字段显示特定的错误消息。
  • 使用这种方法,您不会显示/隐藏其中一个框。您仍然需要一些 JavaScript,但这可能是最少的工作量。
  • 或者,您可以随时在服务器上运行辅助类型检查,并将错误添加到 ModelState 并将其返回到页面。
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多