是否有可能在ajax中通过模型传递其他参数
Is it possible to pass additional arguments with the model in ajax?
使用下面的脚本传递一个强类型模型,它工作得很好。是否有一种方法也包括,与模型,变量的值,作为额外的参数?我知道如何传递模型或变量,但不知道两者都传递。
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,
...
});
然而,这有点笨拙,不容易扩展到更多的附加参数,并且不应该在不净化sample1
和sample2
的值的情况下完成。
根据您的情况,这可能是一个可行的解决方案,但我认为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)
- 如何从其他控制器更改角度模型值
- 挖空、视图模型位于其他对象和数据绑定中
- ng显示基于其他一些html元素的模型值
- backbone.js在其他模型中渲染/创建多个模型
- Aurelia组件在其他视图模型中使用时不共享实例
- Ember.js:一个模型如何观察其他模型
- 当可观察数组是其他模型的属性时,挖空不会更新 UI
- 角度ng模型依赖于形式上的其他ng模型
- 如何将外部 API 中的其他数据添加到集合中的现有模型
- 主干.js:如何在集合/其他模型中实例化模型
- 可由其他视图模型访问的挖空可观察/视图模型
- 点击模型并添加到主干中的其他集合中
- 为什么Ember模型的命名与其他模型不同
- 使用干净的url将模型传递给chaplinjs中的其他控制器
- 如何在角度js中使用模型的值作为其他模型的名称
- 当指令的其他实例中的模型发生更改时,检查函数
- Ember.js渲染模板在其他模板中没有获取模型
- 将数据模型设置为其他数据模型的属性
- 如何在backbone.js中将视图/模型的引用传递给其他视图/模型/路由?
- v模型上的输入,动态地改变其他脚本的值