在ASP.NET MVC 3中使用不显眼的验证时,防止表单提交

时间:2011-04-23 01:05:45

标签: asp.net asp.net-mvc validation asp.net-mvc-3 unobtrusive-javascript

我正在尝试使用ASP.NET MVC3不引人注目的javascript实现远程验证。

它似乎有用,但即使它不应该有效,我也可以提交我的表格。

看起来验证发生得不够快。我使用ASP.NET开发服务器和VS 2010调试器,并不总是触发远程验证方法。当我稍等一下时,验证就会发生,我无法提交表格。

我开始认为客户端远程验证不够可靠,我可能应该考虑使用服务器端验证,以确保应用正确的验证。

有没有办法解决这个问题?

修改

就像你问的那样,这是我的代码相对于问题的一部分。 我将首先采纳您的建议并使用服务器端验证来避免用户绕过我的验证。

型号:

[Required(ErrorMessage = "*"), StringLength(50)]
[Remote("EventCategoryNameExists", "EventCategories",
    AdditionalFields = "EventCategoryId",
    ErrorMessageResourceType = typeof(Messages),
    ErrorMessageResourceName = "EventCategoryNameAlreadyExists")]
[LocalizedDisplayName("Name")]
public string Name { get; set; }

查看:

<div id="formMain">

    @Html.HiddenFor(x => x.EventCategoryId)

    <fieldset class="formFieldset">
        <legend>@Labels.EventCategoryDetails</legend>
        <div class="formFieldsetContent">
            <table id="formTable" class="formTable">
                <tr>
                    <td class="formLabelCell" style="width: 90px;">
                        @Html.LabelFor(x => x.Name)&nbsp;:&nbsp;
                    </td>
                    <td class="formInputCell">
                        @Html.EditorFor(x => x.Name)
                        @Html.ValidationMessageFor(x => x.Name)
                    </td>
                </tr>
                <tr>
                    <td class="formLabelCell" style="vertical-align: top;">
                        @Html.LabelFor(x => x.Color)&nbsp;:&nbsp;
                    </td>
                    <td class="formInputCell">
                        @Html.EditorFor(x => x.Color)
                        @Html.ValidationMessageFor(x => x.Color)
                    </td>
                </tr>
            </table>
        </div>
    </fieldset>
</div>

<div class="formButtons">                      
    <input type="submit" id="btnSave" value="@Labels.Save" class="formButton" />
    <input type="button" id="btnCancel" value="@Labels.Cancel" class="formButton" />
</div>

控制器:

public ActionResult EventCategoryNameExists(int eventCategoryId, string name)
{
    return Json(!_eventService.EventCategoryNameExists(eventCategoryId, name), JsonRequestBehavior.AllowGet);
}

2 个答案:

答案 0 :(得分:2)

客户端验证永远不够。 Javascript不能指望启用或更正,加上它可以被一个狡猾的用户绕过。但是你的客户端验证例程是否返回布尔值false?如果没有,则无论如何都会进行正常的提交操作。

答案 1 :(得分:0)

您的数据注释也在服务器端进行处理 - 因此您可以做到这一点。但是远程验证属性不是。您需要自定义验证属性,或者还需要在服务器端检查相同的例程。将您的验证调用提取到您在HttpPost操作中检查的一般方法(如果它失败使用ModelState.AddError),并且还有你的远程验证方法,那么你应该很好。远程验证仍然是一个不错的客户端功能,所以如果你想要这个功能,我不会完全废弃它。

至于你的具体时间问题 - 我刚刚在我的远程验证页面上做了一些测试。我设置fiddler在请求之前有断点。在我从服务器返回响应之前,我无法提交表单。尝试使用提琴手,看看你是否可以通过这种方式重现它。我很好奇,如果你的页面上的其他内容正在踩踏你的远程验证。我有一个更新版本的jQuery和远程验证的问题。当我默认回到基本的MVC3项目时,它运行得很好 - 我没有进一步调试它,但这是因为版本差异。