不验证隐藏字段 (jQuery)

Don't validate hidden field (jQuery)

我有一个包含 select 元素的表单,如果选择 'Other' 选项,则会出现一个 textarea 下拉菜单,要求提供额外信息。

我希望这个 textarea 是必需的,除非 select 选项不是 'Other'。

我该怎么做?

JavaScript(将表单提交给控制器)​​

var submitAnimatedForm = function (formHold, controllerURL, successMessage) {
    if (formHold.length) {
        var _form = formHold.find("form");

        _form.on("submit", function (e) {
            e.preventDefault();

            // Disables submit button on click
            $(':input[type=submit]').prop('disabled', true);

            // If the form is valid, post AJAX.
            if (_form.valid()) {
                setTimeout(function () {
                    $.ajax({
                        type: 'POST',
                        url: '/Umbraco/Surface/Contact/SubmitQuote',
                        data: _form.serialize(),
                        dataType: 'json',
                        encode: true,
                        success: function (data) {

                            if (!data.success) {
                                alert("ERR"); // - This is what I keep getting back
                            } else {
                                alert("SUCCESS");
                            }

                        },
                        error: function (data) {
                            console.log("ERR");
                        }
                    });
                }, 2000);
            }
        });
    }
};

C#(检查模型数据)

控制器:

if (!ModelState.IsValid)
{
    return Json (
        new
        {
            success = false,
            message = "Sorry, we encountered an error."
        }
    );
}

return Json (
    new
    {
        success = true,
        message = "Thank you, your request has been sent!"
    }
);

型号

public class ServiceModel
{
    [Required(ErrorMessage = "Your first name is required")]
    public String Firstname { get; set; }

    [Required(ErrorMessage = "Your last name is required")]
    public String Lastname { get; set; }

    [Required(ErrorMessage = "Your e-mail address is required")]
    [DataType(DataType.EmailAddress)]
    public String Email { get; set; }

    [Required(ErrorMessage = "Your job location is required")]
    public String Location { get; set; }

    [Required(ErrorMessage = "This field is required")]
    public String Service { get; set; }

    [Required(ErrorMessage = "Your job description is required")]
    public String Description { get; set; }

    public String EstimatedCost { get; set; }
}

我认为这与我的 C# 代码有关,我相信我可以像这样进行修复:

if (objModel.Service == "Other") 
{
    if (String.IsNullOrWhitespace(objModel.Description))
    {
        return Json (
            new
            {
                success = false,
                message = "Please fill out your description!"
            }
        )
    }
}
else
{
    // - Send an e-mail
}

但问题是它不检查模型的其余部分,只检查服务描述。

如有任何帮助,我们将不胜感激! :)

谢谢

在这种情况下,我有两个想法供您参考:

  1. 实施自定义 jQuery 验证程序以根据 select 元素的值验证您的文本区域。

对于此方法,请查看 jQuery 文档以了解 validator.addMethod and an example here


  1. 另一种方法是向 select 元素添加一个 onChange 函数,并根据值
  2. 使文本区域成为必需的

对于此方法,请检查 this answer to check how to add the onChange function, and this answer 以检查如何根据需要设置元素。


更新

好的,第二次看了你的问题,我相信你也想在服务器端验证你的表单。为此,您可以创建一个自定义验证方法并使用该方法装饰您的 属性,例如 in this answer.

您可以创建自己的验证属性以放置在模型中的 'Description' 属性 之上。

您可以了解如何创建自己的验证属性 here

并且在自定义验证属性 IsValid 方法 class 中,您可以实现逻辑来确定验证的成功条件,这与您在例如。