【问题标题】:MVC 4 - jQuery Ajax Post Full Form Data to Specific MethodMVC 4 - jQuery Ajax 将完整表单数据发布到特定方法
【发布时间】:2013-08-09 05:16:48
【问题描述】:

我真的很好奇。是否可以让 jQuery Ajax 发布操作将整个表单数据(无论是否序列化)发送到 MVC 4 方法,该方法具有与表单输入 ID 同名的特定参数,同时排除不匹配的元素?

MVC 4 控制器方法

[HttpPost]
public JsonResult DoWork(string companyName, string firstName, string lastName, string email)
{
    //.. do stuff and return result...
}

HTML

<form id="MyForm" method="post">
    <input id="CompanyName" name="CompanyName" type="text"/>
    <input id="FirstName" name="FirstName" type="text"/>
    <input id="LastName" name="LastName" type="text"/>
    <input id="Email" name="Email" type="text"/>
    <input id="Var1" name="Var1" type="text"/>
    <input id="Var2" name="Var2" type="text"/>
</form>

jQuery Ajax

$.ajax({
type: 'post',
dataType: 'html',
url: '/Controller/DoWork',
data: $('#MyForm').serialize()
});

如果不可能开箱即用,有没有人有一些基本的想法可以让我研究如何实现这一点?我想让某人“更难”弄清楚我的方法调用,而不给他们提供使方法工作所需的确切参数名称和值。

【问题讨论】:

  • 您能否对您所说的部分更具体一点:“同时排除不匹配的元素”?
  • 如果您注意到 html 中有两个名为 Var1 和 Var2 的额外输入。这些在调用控制器方法时不会得到“处理”,因为没有同名的参数。

标签: c# jquery ajax asp.net-mvc-4


【解决方案1】:

是否可以让 jQuery Ajax 发布操作发送整个 将数据(序列化与否)转换为具有特定的 MVC 4 方法 与表单的输入 ID 同名的参数,但不包括 不匹配的元素?

是的,这是可能的。但是您还记得,您仍然可以通过Reques 对象访问那些发布的数据。您实际上可以删除控制器方法中的所有参数,并且仍然可以向其发布数据。在控制器方法中使用参数的真正好处是参数的类型是否为对象 - 视图模型。具有数据注释的视图模型,因此您可以进行验证。但请注意,这不是必需的,它只是一种技巧。

另外需要注意的是,如果你有类似的东西

public ActionResult DoWork(string first, string last, int id, int? id2) {
}

并且您只传递firstlast 的数据,您的发布操作将导致异常。异常将出现在控制器期望接收值的id 参数上。现在,如果您将值传递给 firstlastid 参数但忽略 id2,则不会发生异常,因为 id2 将具有空值。

因此,您发布的示例将起作用。如果你想得到它们的值,你可以通过Request["Var1"]Request["Var2"] 得到Var1Var2 的值。你当然可以忽略它们。

【讨论】:

  • 我理解,在这种情况下,控制器方法不是视图模型。但是通过删除参数,它使单元测试更像 WebForms。我想保留参数名称并将它们映射到发布数据,最好什么都不做。
  • 那么问题出在哪里?请再次阅读我的答案,当您发表评论时,我可能已经更新了它。我引用了你的问题,我相信这就是你要问的。你在问另一件事吗?我误解了您的全部或部分问题吗?
  • 我不想使用 Request 对象。在我的代码示例中,ajax 帖子将因 ajax 错误而失败。基本上我上面贴的代码是行不通的。
  • “我不想使用 Request 对象”这就是为什么我说你可以忽略它们。我只是在解释它是如何工作的。请发布您遇到的错误。
  • 经过调查,你是对的。数据确实发布并映射到字段。我现在遇到的问题是我已将 ValidateAntiForgeryToken 属性添加到方法中,这导致了问题。
【解决方案2】:

呃,我希望您不要使用此处接受的答案作为这样做的方法。这个问题实际上是重复的,这里的答案是做你想做的事情的首选方式: Passing parameters when submitting a form via jQuery in ASP.NET MVC

【讨论】:

  • 对我来说看起来很像。我同意这个问题是重复的。但是,如果您认为接受的答案是错误的,那么请解释为什么它是错误的,以及为什么您的答案是更受欢迎的方法。
  • 你当然是对的,我没有说明原因 接受答案的真正问题是它迫使你手动进行所有模型绑定、类型转换,这违背了 MVC 的目的.只需接收模型、一个额外的参数,然后让 MVC 模型绑定器为您完成所有工作......永远,永远争取干净的代码。
猜你喜欢
  • 2013-03-16
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2014-12-13
  • 1970-01-01
  • 2016-06-21
  • 2015-01-31
相关资源
最近更新 更多