通过触发特定的提交按钮停止不引人注目的验证

时间:2016-03-21 16:04:52

标签: jquery asp.net-mvc unobtrusive-validation

我的网页上有几个类型为input的{​​{1}}个字段。对于其中一些我希望验证正常发生,但在其他情况下我不这样做。每个submit按钮将表单发回给控制器,为每个按钮设置一个命令值。这允许动作执行相关功能。但是,如果我将类submit添加到相关的cancel标记,则不会对它们进行验证。但是,我没有获得发回控制器操作的命令的值。所以我可以不验证或获取命令值,但不能同时使用。

设置;

模型;

input

在HTML中;

public void SubData
{
    public int ID { get; set; }
}

public void SomeViewModel
{
    public int ID { get; set; }
    public List<SubData> Data { get; set; }
}

控制器;

<input type="submit" name="command" value="AddData" />
<input type="submit" name="command" value="DeleteData/>
<input type="submit" name="command" value="SaveAll/>

Javascript(取自:https://stackoverflow.com/a/17401660);

public ActionResult Index(SomeViewModel model, string command)
{
    switch (command)
    {
        case "AddData":
            model.Stuff.Add(new SubData());
            break;
        case "DeleteData":
            // you get the idea...
            break;
    }
}

所以,如果我有$(function () { // allow delete actions to trigger a submit without activating validation $(document).on('click', 'input[type=submit].cancel', function (evt) { // find parent form, cancel validation and submit it // cancelSubmit just prevents jQuery validation from kicking in $(this).closest('form').validate().cancelSubmit = true; $(this).closest('form').submit(); return false; }); }); ,那么验证就不会发生(耶!)但我没有在动作参数<input type="submit" class="cancel" value="AddSomething" />中提供任何值(嘘!)。取出command触发器验证,验证完成后我会得到cancel的值。

1 个答案:

答案 0 :(得分:0)

尝试使用evt.preventDefault()来阻止此输入的定位

$(function () {
    // allow delete actions to trigger a submit without activating validation
    $(document).on('click', 'input[type=submit].cancel', function (evt) {
        //use  the preventDefault() to stop any submition from here
        evt.preventDefault();
        // find parent form, cancel validation and submit it
        // cancelSubmit just prevents jQuery validation from kicking in
        $(this).closest('form').validate().cancelSubmit = true;
        $(this).closest('form').submit();
        return false;
    });
});