使用下面的脚本传递强类型模型,它工作正常。有没有办法在模型中包含变量的值作为附加参数?我知道如何传递模型或变量,但不是两者。
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)};
});
答案 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,
...
});
然而,这有点笨拙,不容易扩展到更多的附加参数,并且不应该在不清除sample1
和sample2
的值的情况下完成。
根据您的情况,这可能是一个可行的解决方案,但我认为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)
希望对您有帮助。