【问题标题】:ASP.NET MVC Forms with both AJAX and traditional POST support具有 AJAX 和传统 POST 支持的 ASP.NET MVC 表单
【发布时间】:2010-02-26 12:32:15
【问题描述】:

我有一个表单,我目前使用一些 Javascript 功能枚举,然后使用 jQuery .ajax() 将其发布到 MVC 控制器操作。如果我想为发布此表单添加传统(非 JavaScript)支持,我对我的选项几乎没有疑问。

1) 问题是我有一些不在字段中的数据,而只是 div 中的文本。由于我目前正在使用 AJAX 发布,因此我可以在发布之前通过它们的 id 获取这些 div 的内容并将它们包含在帖子中。我认为传统的 POST 会缺少这些信息。

一个想法是为这些 div 也创建一个<input>,但将其隐藏在页面上。然后在 POST 中使用它们。

2) 如果我决定只使用 AJAX 发布,我可以完全摆脱表单吗?

3) 鉴于我一直使用 AJAX 帖子,您建议使用什么格式来发布值? JSON,逗号分隔(复杂数据有问题),还有什么?

4) 你通常支持这两种方式吗?因为如果我现在查看我的表单,它们使用了大量的 jQuery 和 jQuery UI 功能,而如果没有 JavaScript 来实现这些功能,那就有点过头了。用户没有启用 JS 的可能性有多大,只说“需要 JS”可以吗?

对于这个具体案例,我正在构建一个内部的按需应用程序,它不会面向 Web(至少现在还没有),所以我可以选择说 JS 是必需的。

ty

【问题讨论】:

    标签: javascript jquery asp.net-mvc html-post


    【解决方案1】:

    如果您想在没有 javascript 的情况下维护一个可用的网站,那么我建议您首先让一个网站在没有它的情况下运行,然后使用 javascript 将该界面修改为您真正想要的启用 javascript .这需要从 input 元素中包含的所有输入开始,然后使用 javascript 将这些元素替换为您的 div 元素——或者,更实际地,删除 inputs 并显示预先存在的 div 元素。

    我认为即使在使用 AJAX 时也没有必要删除表单,尽管从技术上讲没有理由拥有它。然而,我喜欢做的一件事是保留表单,然后让我的提交方法从 form 标记中提取操作,这样我就不需要直接在 javascript 中对其进行编码。您可能会发现这样可以更轻松地在各种表单之间共享 javascript。

    我总是序列化到请求参数,就像通常的表单一样。最简单的方法是使用 jQuery serialize 方法,但这仅适用于输入。您还可以构造一个散列(对象中的键值对)并将其作为 AJAX 的数据参数提供。它将自动序列化以请求参数。使用其他任何东西都需要您使用自己的代码进行反序列化,而不是使用 MVC 中的模型绑定代码。

    对于面向公众的网络应用程序,我尝试让界面同时适用于启用 javascript 和禁用 javascript 的浏览器。不过,非 JavaScript 浏览器有时无法访问某些功能。对于内部应用,我很乐意要求使用 javascript,因为您(或您公司中的某个人)对它有更多的控制权。

    【讨论】:

    • 如何在 .ajax() 方法中使用 serialize() 的结果?我的 MVC 操作应该是什么样子?
    • 您的 ajax 请求中的数据将是 data: $('form').serialize() 或者如果您想将表单元素与来自 DIVS 的数据结合起来,您可能会创建一个对象 var inputs = $('form').serialize() + "&div1=" + $('#div1').text() + ...。然后将变量用作您的数据:data: inputs。该操作的唯一真正区别是,对于 AJAX,您可能会返回 JSON 或部分视图 (HTML),用于从 ajax 回调更新页面。当来自普通帖子时,您将返回完整视图。通常,输入将填充用作参数的视图模型
    • 1) 另一件事 - 单击按钮 ajax() 后通过但也发生回发到服务器 - 如何防止这种情况发生? 2) 我的动作有 FormCollection 参数。通过回发,这可以正常工作。 ajax 呢?
    • @mare - (1) 确保您的 ajax 提交函数返回 false 以防止表单的默认操作和 (2) 请求是否是 AJAX 无关紧要,参数应该是一样的。您可能需要考虑使用强类型模型,而不是通用的 FormCollection。
    【解决方案2】:

    我会将div 文本放入隐藏字段 - 否则它不会被传统 POST 获取。

    我个人不会摆脱表单,如果您的 JS 由于某种原因被禁用/损坏会发生什么?即使用户启用了 JS,如果(例如)一个 JS 文件没有加载您的表单,您的表单也将无法通过 AJAX 发送数据。拥有 AJAX,但请确保您可以回退到传统形式的 POST。

    【讨论】:

    • 感谢你们两位的澄清并证明我的想法是正确的。只是你给了我更多的工作要做;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多