是否可以在ajax中传递模型的其他参数?

时间:2014-03-27 01:30:14

标签: javascript ajax asp.net-mvc asp.net-mvc-4

使用下面的脚本传递强类型模型,它工作正常。有没有办法在模型中包含变量的值作为附加参数?我知道如何传递模型或变量,但不是两者。

var sample1 = "aaa";
var sample2 = "bbb";

    $.ajax({

   url: "Action/Controller",
   data: $("#form123").serialize(),       
   cache: true,
   type: "POST",
   dataType: 'html',                                
   success: function (data) {                       
   $('#form123').html(data)};              

});

6 个答案:

答案 0 :(得分:2)

使用$.extend将多个对象合并在一起:

data: $.extend( $("#form123").serialize(), { something: 'else'}, { and: 'even', more: 'things'} )

或者,只需将其他字段添加到表单中<input type='hidden' ...>元素

即可

答案 1 :(得分:1)

您可以将data对象设置为包含三个属性,一个用于序列化表单,另一个用于样本。

data: {
  formData: $("#form123").serialize(),
  sample1: sample1,
  sampleTwo: sample2
}

更新:鉴于此解决方案无法解决您的问题,可以选择其他方式。

由于.serialize()的结果是将其输入转换为标准的URL编码形式,例如prop1=val1&prop2=val2,您可以将其他变量附加到输出字符串。例如,

var formData = $("#form123").serialize() + '&' + sample1 + '&' + sample2;
$.ajax({
  ...
  data: formData,
  ...
});

然而,这有点笨拙,不容易扩展到更多的附加参数,并且不应该在不清除sample1sample2的值的情况下完成。

根据您的情况,这可能是一个可行的解决方案,但我认为Robert Levy's suggestion将数据添加到表单中的隐藏输入可能是更好的。

答案 2 :(得分:1)

除了@ Michael的回答,你也可以通过路由来做到这一点:

$.ajax({
   url: "Action/Controller/" + sample1 + "/" + sample2,
   data: $("#form123").serialize(),       
   cache: true,
   type: "POST",
   dataType: 'html',                                
   success: function (data) {                       
   $('#form123').html(data)};              

});

使用这种方法,您需要定义路线,以便解释额外的参数。

答案 3 :(得分:0)

更清洁,更“MVC”的解决方案是使用Ajax.BeginForm

无需编写任何自定义JavaScript。只需将您的视图设置为:

@using(Ajax.BeginForm("Action", "Controller", new {@param1 = "aaa", @param2 = "bbb"}, new AjaxOptions(){HttpMethod = "Post", UpdateTargetId = "#section1"})){
<div id="#section1">

..... put your form controls here . . . 

</div>
}

提交时,表单将向服务器发送包含提供的参数+任何表单数据的ajax请求。响应将#section1的内容替换为结果(由UpdateTargetId选项指定)。

为此,您的控制器操作将类似于

public PartialViewResult Action(string param1, string param2, ViewModel model)

答案 4 :(得分:0)

我不确定 vars 是服务器端变量还是客户端变量。

无论哪种方式,我认为你应该将它们嵌入你的FORM中,这样它们就会被序列化并与表格的其余部分一起发送。

对于服务器端/ Razor变量

<input type="hidden" id="var1" name="var1" value="@sample1" />

对于客户端/ JS变量

<input type="hidden" id="var2" name="var2" value="" />

$('#var2').val(var2); //before sending your form of course!

答案 5 :(得分:0)

我知道这是一个老问题,但是我也遇到了同样的问题,这是出现在搜索它的第一页,所以我想分享其他方法。

在url部分中使用

url: '@Url.Action("Action", "Controller", new { sample1= "XXX", sample2 = "XXX" })'

请记住,变量{{1}和sample2 {{}}不能是新{}中的js,因为它是htmlHelper并且处于不同的上下文中,但是您可以使用Viebag / ViewData或razor变量来设置sample1 / 2值或就像我的示例一样使用静态文本。

其余代码保持不变。

$.ajax({
url: '@Url.Action("Action", "Controller", new { sample1= "XXX", sample2 = "XXX" })'
   data: $("#form123").serialize(),       
   cache: true,
   type: "POST",
   dataType: 'html',                                
   success: function (data) {                       
   $('#form123').html(data)};              

});

在控制器中:

public async Task<XXX> Action(Model data, string sample1, string sample2)

希望对您有帮助。