2016-09-06 129 views
0

我正在使用MVC ViewModel。在表单中有两个单选按钮 是或否。如果用户选择“是”,则将显示TextField1,如果选择“否”,则将显示TextField2。两者都是带*(asterick)符号的必填字段。即使两者都是必填字段,用户只能根据单选按钮选择一次只填写一个TextField。这个问题是当用户提交一个textfield所需的验证错误信息显示时。有没有解决此问题的解决方法。MVC表单验证失败,原因是两个必填字段未使用的字段

+0

那么这两个字段在您的模型中声明为'Required'作为DataAnnotation? –

+0

是的。两者都是必填字段。 – VVR147493

+0

所以你反对使用JavaScript?如果没有,为什么不把'Required'数据注释从你的模型中取出,然后在JS中检查一下或者其他单选按钮是否被选中,如果是,那么'.attr(“required”)'? –

回答

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,并作出任何比这个更广泛的答案已经是。

+0

感谢您的快速更新。这似乎是最好的答案,而不是使用JavaScript。但是,当用户提交我想显示验证错误消息的适当的领域。如果我仅使用一个字段,则无法显示未选择的字段的特定错误消息。 – VVR147493

+0

用这种方法,你不会显示/隐藏其中一个框。你仍然需要一些JavaScript,但这可能是最少的工作量。 – krillgar

+0

或者,您始终可以在服务器上运行辅助类型检查,并向ModelState添加错误并将其返回到页面。 – krillgar