是否有可能在ajax中通过模型传递其他参数

Is it possible to pass additional arguments with the model in ajax?

本文关键字:模型 其他 参数 有可能 ajax 是否      更新时间:2023-09-26

使用下面的脚本传递一个强类型模型,它工作得很好。是否有一种方法也包括,与模型,变量的值,作为额外的参数?我知道如何传递模型或变量,但不知道两者都传递。

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)};              
});

使用$。扩展以合并多个对象:

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

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

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

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

Update:鉴于此解决方案在您的情况下不起作用,这里有一个替代方案。

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

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

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

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

除了@Michael的答案,您还可以通过路由:

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

使用这种方法,你需要定义一个路由,这样你就可以解释额外的参数。

使用Ajax.BeginForm是一个更简洁、更像MVC的解决方案。

不需要编写任何自定义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)

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

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

服务器端/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!

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

在url部分使用

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

请记住,变量sample1和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)