加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – POST数据中不包含MVC 3远程验证表单按钮

发布时间:2020-12-16 03:25:15 所属栏目:asp.Net 来源:网络整理
导读:我有一个ASP.NET MVC3应用程序,并在我的一个模型类上进行远程验证.我发现如果在提交表单之前打开该模型的编辑视图并且未调用远程验证例程(由于没有编辑带有远程验证的字段),则按钮单击以POST表单不包括在请求发送到Action方法的数据. 如果在表单发布之前调用
我有一个ASP.NET MVC3应用程序,并在我的一个模型类上进行远程验证.我发现如果在提交表单之前打开该模型的编辑视图并且未调用远程验证例程(由于没有编辑带有远程验证的字段),则按钮单击以POST表单不包括在请求发送到Action方法的数据.

如果在表单发布之前调用远程验证例程 – 单击该按钮以提交POST中包含的表单IS.

我需要知道在服务器上调用Action时单击了哪个按钮,以便我可以确定用户是否单击了UPDATE或CANCEL.

如果我从模型中删除远程验证,则表单每次都会正确提交.

为什么在表单提交之前未调用远程验证时,用于提交表单的按钮将从表单发布中排除.

谢谢
迈克尔

以下是一些示例代码:

@model Channel
<script src="@Url.Content("~/Scripts/jquery-1.6.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
<fieldset>
    <legend>Edit Channel</legend>

    @Html.HiddenFor(model => model.ChannelGUID)


    <div class="editor-label">Name</div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <div class="editor-label">Description</div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Description)
        @Html.ValidationMessageFor(model => model.Description)
    </div>

    <div class="editor-label">Channel Code</div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Code)
        @Html.ValidationMessageFor(model => model.Code)
    </div>

    <p>
        <button type="submit" name="updateCommand" value="Update">Update</button>
        <button type="submit" class="cancel">Cancel</button>
    </p>
</fieldset>
}

这是行动

[HttpPost]
public ActionResult Edit(string updateCommand,Channel channel)
{
    if (updateCommand != null)
    {
     //update clicked
    }
    else
    {
     //cancel clicked
    }

这是模型属性Code的远程属性

[Remote("IsChannelCodeUnique","Channel",AdditionalFields = "ChannelGUID",ErrorMessage = "code must be unique")]

解决方法

我遇到了同样的问题.我将远程验证添加到具有两个提交输入的表单,并且单击的提交按钮的值不再总是发布.

虽然其他答案提供了解决方法,但我深入研究了一下,并回答了您提出的实际问题:“为什么用于提交表单的按钮会在未在之前调用远程验证时从表单发布中排除表格提交.“

我知道一个Javascript Submit does not include the Submit Button Value.因此,我试图发布禁用javascript.验证无效,但我的提交价值已过帐.我假设jquery.validate.js跳入并发送程序化提交.确实如此.这是使用jquery.validate.js 1.9.0,未压缩的情况:

>加载页面时,在第942行,使用远程方法扩展验证器,使用stopRequest原型在第735行扩展验证器.
>当输入字段第一次失去焦点,在此之后输入焦点或提交表单时,将进行验证.
>验证后,调用stopRequest方法.
>单击提交输入时,会以某种方式抑制提交.在第56行中有一个语句event.preventDefault();,但这仅在调试模式下调用.无论如何,单击提交时以及执行远程验证后将调用stopRequest方法.
>当表单有效时,将调用第742行:$(this.currentForm).submit();,这是一个程序化提交,不会发布提交的值.这就是我无法确定单击了哪个提交按钮的原因.

更仔细地查看验证扩展的方式,我在第59行找到了一个处理程序的定义,它似乎旨在克服一些类似的问题:它添加了一个隐藏的输入,其中包含它所处理的提交按钮的名称和值.但是,在我的情况下,既没有定义validator.settings.submitHandler也没有定义validator.submitButton,因此永远不会调用此代码.

如果在这种情况下添加了这个隐藏字段会很好,因为MVC不知道也不关心发布值的输入类型和控制器上的post操作可以只使用该值.

加成
我解决这个问题的方法是为提交的click函数添加一个处理程序:

$('input[type="submit"]').click(function () {
    var hidden = $("<input type='hidden'/>").attr("name",this.name).val(this.value).appendTo($(this).closest("form"));
});

隐藏字段已创建,因此我不必依赖具有正确名称的隐藏字段.您可以为您的提交提供相同的名称,并测试该值,或者为它们指定不同的名称并测试是否存在post参数.当然,您还需要使用尚未使用的表单字段名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读