【问题标题】:MVC 3 Checkbox Turn Off Validation Not Using RequiredAttributeMVC 3复选框关闭验证不使用RequiredAttribute
【发布时间】:2013-05-17 09:51:24
【问题描述】:

我一直在 stackoverflow 上寻找这个答案。似乎无法与他们一起去任何地方。我有一个实体,它有 5 个导航属性到其他实体。示例:

public class Computer : DbEntity
{
    public virtual Ram Ram { get; set; }
    public Guid RamId { get; set; }

    public virtual Hdd Hdd { get; set; }
    public Guid HddId { get; set; }

    // etc. etc. you get the picture

}

为了构建视图,我为HddRam 等创建了部分视图,并将它们引用到主视图中:

@model ComputerSite.ViewModels.ComputerViewModel

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Computer Details</legend>
        ... some fields ...
    </fieldset>

    Html.RenderPartial("Create", "Ram");

    Html.RenderPartial("Create", "Hdd");
}

我对此进行了测试,它工作正常,所有数据都被发送回 ViewModel,并且可以保存在数据库中,所以我知道所有这些工作。当Computer 没有Ram 时,问题就来了。我希望能够选中一个框来说明不包括在内。并在提交表单时绕过Ram验证。

应该有一个非常简单的方法,我不介意它是否是一个 JavaScript 函数,它会改变一些 data- 属性客户端。我只是不完全确定从哪里开始,自定义属性不是前进的方向。似乎只是改变一些领域。如果未选中复选框并且验证已到位,我仍然希望验证字段,并且该位有效,因此为什么我要问这个问题,我只需要能够有选择地关闭不同部分表格。

哦,顺便说一句,我在任何实体类中的属性都没有[Required] 属性!

如果您使用 JavaScript,请提供示例。我已经 100% 精通它了。

【问题讨论】:

  • 您只对 JS 解决方案持开放态度吗?
  • 好吧,我正在使用 jquery 不显眼的验证,所以它必须是与之相关的东西,我无法想象我需要在服务器端做任何事情。只用JS禁用几个字段,你有什么建议?
  • 我经常使用fluentvalidation.codeplex.com。它只支持客户端的简单验证,但它对服务器端非常强大

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


【解决方案1】:

看看万无一失的验证项目,它有更多的验证方法,包括requiredif。 http://foolproof.codeplex.com/

另一方面,您可以关闭一个设置来禁用隐式验证。详情看这个答案https://stackoverflow.com/a/4845768/1563373

【讨论】:

  • 我将尝试 Nullable 属性的路线,因为它们可以是这样的。
【解决方案2】:

我刚刚禁用了我不想使用 JQuery 进行验证的表单部分,并且有效。

<script type="javascript">
    $(function () {
        function EnableControls() {
             $("#Computer_Cpu").removeAttr("disabled");
             $("#Computer_Motherboard").removeAttr("disabled");
        }

        function DisableControls() {
             $("#Computer_Cpu").attr("disabled", "disabled");
             $("#Computer_Motherboard").attr("disabled", "disabled");
        }

        var disabled = true;
        $("#Enable_Controls_Checkbox").change(function () {
             if (disabled) {
                 EnableControls();
             } else {
                 DisableControls();
             }
        });

        DisableControls();
    })

</script>

作为一个运行,这个脚本在加载时禁用我想要的所有控件。所以默认是你不能编辑它们。有一个名为Enable_Controls_Checkbox 的复选框,选中后将启用所述控件。 attr(obj, obj) 根据我的理解添加/更改 HTML Dom 的属性,而 removeAttr(obj) 正如它所说的,删除了一个属性。

可能有一个更优雅的解决方案,但它的工作原理也同样有效。

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 2011-09-20
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多