是否有可能从控制器字符串的形式返回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。
JSON应该从JsonResult动作返回。 –
@达林..我不使用jQuery的Ajax而是使用MVC的Ajax.how在这种情况下做? –
@ Darin ..感谢您的宝贵意见。我们将视图模型放在项目目录结构 –