是否可以从控制器操作以字符串形式返回 java 脚本
你可以返回一个JavaScriptResult
:
[HttpPost]
public ActionResult TestAjax(FormCollection form)
{
int strnum1 = Convert.ToInt32(form["txtbox1"].ToString());
int strnum2 = Convert.ToInt32(form["txtbox2"].ToString());
return JavaScript("<script>alert(\"some message\")</script>");
}
为此,您必须配置您的 AJAX 请求以执行 javascript。例如,如果您使用的 jQuery 看起来像这样:
$.ajax({
url: '/someaction',
type: 'POST',
data: { txtbox1: '12', txtbox2: '13' },
dataType: 'script'
});
作为替代方案,您可以返回一个JsonResult,它将模型序列化为 JSON 字符串:
[HttpPost]
public ActionResult TestAjax(FormCollection form)
{
int strnum1 = Convert.ToInt32(form["txtbox1"].ToString());
int strnum2 = Convert.ToInt32(form["txtbox2"].ToString());
string strnum3 = Convert.ToString(strnum1 + strnum2);
return Json(new { sum = strnum3 });
}
接着:
$.ajax({
url: '/someaction',
type: 'POST',
data: { txtbox1: '12', txtbox2: '13' },
success: function(result) {
alert(result.sum);
}
});
正如您在此处看到的,您不再将 javascript 与控制器中的 C# 代码混合在一起。尊重 DRY 原则。javascript 属于 javascript 文件。
作为对这个控制器操作的进一步改进,我建议您引入一个视图模型并摆脱从 FormCollection 解析内容的可怕管道代码。这是默认模型绑定器的职责。
所以:
public class SumViewModel
{
public int TxtBox1 { get; set; }
public int TxtBox2 { get; set; }
}
接着:
[HttpPost]
public ActionResult TestAjax(SumViewModel model)
{
int sum = model.TxtBox1 + model.TxtBox2;
return Json(new { sum = sum });
}
结论:我们已经把这个控制器动作放在了节食上,并将 javascript 移到了它所属的位置。