【问题标题】:In MVC, how can I make a field in a model non-required after a checkbox is checked?在 MVC 中,如何在选中复选框后使模型中的字段成为非必需字段?
【发布时间】:2011-02-03 19:06:16
【问题描述】:

我有一个使用 .NET MVC 编写的页面。在名为 PersonModel 的 Person 模型中,我定义了这个,它要求用户在姓氏字段中输入一些文本:

    <DisplayName("Last Name"), Required()> _
    Public Property LastName() As String
        Get
            Return _LastName
        End Get
        Set(ByVal value As String)
            _LastName = value
        End Set
    End Property

在表单上,​​有一个复选框,用户可以选中它来做一些其他事情。有没有办法,最好使用 JQuery,将姓氏字段更改为非必需?如果不使用 JQuery,我对其他建议持开放态度,但由于无论如何在选中此复选框时我正在做很多事情,我希望我可以在其中添加这个逻辑。这是我在选中此框以演示时所做的一些示例...

函数doOwnerBusiness(事件) {

        if ($(this).is(':checked')) {

         $('input[name="People_1__LastName"], label[for="People[1]_LastName"]').hide();​
         $("#People_1__LastName").hide();
         $("#People_1__LastName").val("");
         $("#People_1__LastName :input").attr('disabled', true);               


            $('input[name="People[1]_Suffix"], label[for="People[1]_Suffix"]').hide();​
            $("#People_1__Suffix").attr('disabled', true);
            $('#People_1__Suffix')[0].selectedIndex = 0;
            $('#People_1__Suffix').hide();

       }

        else {

       $('input[name="People_1__LastName"], label[for="People[1]_LastName"]').show();          
            $("#People_1__LastName").show();
            $('#People_1__LastName :input').attr('disabled', false);

        }
    }

对此的任何帮助将不胜感激。

谢谢

威廉

这是我声明我的复选框的方式,也是我试图检查它是否被选中的函数的一部分......

                    <%=Html.CheckBoxFor(Function(model) model.FirstNameAsBusiness)%>
                    <%=Html.LabelFor(Function(model) model.FirstNameAsBusiness)%>



Function Nominate(ByVal m As NominationModel, ByVal captchaValid As Boolean) As ActionResult


    If Not m.FirstNameAsBusiness.checked AndAlso String.IsNullOrEmpty(m.lastnametext) Then
        ModelState.AddModelError("LastName", "Last Name field is required if you don't yada yada...")
        Return View()
    End If

【问题讨论】:

    标签: asp.net-mvc checkbox required


    【解决方案1】:

    简短的回答:不。您不能通过 jQuery 调用绕过 DataAnnotation。

    从技术上讲,姓氏字段不是必需的。因此,我将删除必需的 DataAnnotation,然后在后端,当用户提交表单时,在未选中复选框时验证字段值是否存在。如果条件没有通过,并且该字段的 ModelState 出现错误,则重定向到页面。 (为 c# 道歉):

    public ActionResult Index(HomeIndexModel form)
    {
        if (!form.Checked && string.IsNullOrEmpty(form.LastName))
        {
            ModelState.AddModelError("LastName", "Last Name field is required if you don't yada yada...");
            return View();
        }
    
        //conditional requirement passed...
    }
    

    如果你想变得更高级一点,你可以看看这个帖子,虽然这里的所有建议也是服务器端的: ASP.NET MVC Conditional validation

    【讨论】:

    • 感谢您的建议。我明天回去工作时会试试这个。最好的问候...
    • 当尝试检查复选框时,如果它已被如上所述选中,它会抛出一个错误,指出“已选中”不是布尔值的成员。我正在更新我上面的帖子以显示我的功能部分是什么.....
    • Hey Lee -- 我假设您创建了一个名为 HomeIndexModel 的 ViewModel,并带有一个名为 Checked 的属性,它是一个布尔类型。然后,在您的视图中,您将继承该 ViewModel 作为模型并使用 HtmlHelper 在表单中创建一个字段:Html.TextBoxFor(m => m.Checked)。查看:weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2020-02-27
    相关资源
    最近更新 更多