Ajax.BeginForm()不发送提交按钮的名称/值

时间:2012-07-31 10:10:30

标签: jquery asp.net-mvc-3 asp.net-ajax

我有以下代码,当我点击提交按钮时,其名称和值未发送到服务器

@using(Ajax.BeginForm(new AjaxOptions{Url = "http://localhost/controller/action"}))
{
    <button name="action" type="submit" value="Save">
        <span>Save</span>
        <!-- More HTML tags here -->
    </button>
}

我查看了jquery.unobtrusive-ajax.js文件,看它是否应该发送被点击的按钮的名称/值,并找到这些代码将这些值作为属性附加到表单中,后来传递给该表单在邮政要求中。

$("form[data-ajax=true] :submit").live("click", function (evt) {
    var name = evt.target.name,
        form = $(evt.target).parents("form")[0];

    $(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []);

    setTimeout(function () {
        $(form).removeData(data_click);
    }, 0);
});

evt.target.nameevt.target.value的值包含注册点击的按钮标记中HTML元素的名称/值。

我设法通过在上面的代码中将evt.target替换为evt.currentTarget来使其工作,但我有点担心这可能会产生意想不到的副作用。

有没有更好的方法将提交按钮的名称/值发送到服务器?

1 个答案:

答案 0 :(得分:1)

我已经重现了您描述的问题,您提出的代码修复似乎对我有用。

我可以理解您不愿意修改标准jquery.unobtrusive-ajax.js库,因为您必须记住在发布新版本时合并您的更改。更好的选择是提交补丁,以便可以审查您的修复程序,并希望将其合并到标准库中。我不知道解决这个问题的最佳方法,但我相信很大一部分ASP.NET代码现在都是开源的including MVC,并且微软已经开始接受来自社区的代码贡献。我建议您查看http://aspnetwebstack.codeplex.com/以获取更多信息。

作为更改库的替代方法,您是否考虑过无需在按钮中包含子元素?如果您的按钮仅包含文本(并且没有标签),则标准库可正常工作并发布按钮的名称和值。如果您需要图像,您可以使用CSS background-image属性而不是嵌套的img标记。