3

我试图在 ASP.net MVC 2.0 应用程序中这样做。我有一个包含两个字段 number1 和 number2 的表单。

我想使用 ajax 请求添加两个这两个数字。在控制器中,我收到两个数字,将它们相加并将结果存储在另一个字符串中。然后,我这样做:

    [HttpPost]
    public string TestAjax(FormCollection form)
    {
        int strnum1 = Convert.ToInt32(form["txtbox1"].ToString());
        int strnum2 = Convert.ToInt32(form["txtbox2"].ToString());
        string strnum3 = Convert.ToString(strnum1 + strnum2);
        if (strnum3 != null)
        {
            return "<script>alert("some message")</script>";
        }

        return string.Empty;

    }

是否可以从控制器操作以字符串形式返回 java 脚本?

4

3 回答 3

10

是否可以从控制器操作以字符串形式返回 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 移到了它所属的位置。

于 2013-10-23T12:17:58.440 回答
1

尝试这个,

[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);
        if (strnum3 != null)
        {
            return "<script>alert("some message")</script>";
        }

           return JavaScript("JSFunction(paramtr);");    
    }

看法:-

function JSFunction(paramtr)
{

}
于 2013-10-23T12:23:43.057 回答
1

为什么不使用您的 ajax 成功回调函数?

[HttpPost]
public string TestAjax(FormCollection form)
{
    int strnum1 = Convert.ToInt32(form["txtbox1"].ToString());
    int strnum2 = Convert.ToInt32(form["txtbox2"].ToString());
    string strnum3 = Convert.ToString(strnum1 + strnum2);
    if (strnum3 != null)
    {
        return strnum3;
    }

    return string.Empty;

}

$.ajax({
    url: "/Controller/TestAjax/",
    type: "POST",
    data: /* form data here */,
    success: SuccessCallback,
    error: FailureCallback
});

function SuccessCallback(data) {
   alert(data);
}
于 2013-10-23T12:18:26.553 回答