将一个字符串从MVC Controller返回到jQuery

时间:2014-01-31 10:23:37

标签: c# jquery asp.net asp.net-mvc asp.net-mvc-4

我想调用ASP.NET MVC4 Controller并让它将字符串返回给jQuery方法,然后使用alert()输出该字符串。以下代码仅输出object Object

jQuery的:

$launchTRs = function (appID) {
    var html = $.get("/PartialView/GetTRAsString?appID=" + appID, function (data) { });
    alert(html.toString());
}

ASP:

public string GetTRAsString(string appID)
{
    // Populate revisions
    string html = "<ul>";

    foreach(RevesionInfo revInfo in revisions)
    {
        html += "<li>" + revInfo.RevDesc + "</li>";
    }

    html += "</ul>";

    return html;
}

Outut:

[object Object]

4 个答案:

答案 0 :(得分:22)

在ASP.NET MVC控制器操作中,不返回字符串。他们返回ActionResults。

首先修复你的行动(请阅读下面的内容,了解为什么我将修正用斜体,这是因为那只是第一阶段):

public ActionResult GetTRAsString(string appID)
{
    // Populate revisions
    string html = "<ul>";

    foreach(RevesionInfo revInfo in revisions)
    {
        html += "<li>" + revInfo.RevDesc + "</li>";
    }

    html += "</ul>";

    return Content(html, "text/html");
}

AJAX中的第一个A字母代表异步,因此您应该将警报放在成功回调中,这是唯一可以获得结果的地方:

$.get('/PartialView/GetTRAsString', { appID: appID }, function (data) { 
    alert(data);
});

还要记住,在控制器动作中生成HTML是一个糟糕的主意。混合C#和HTML导致丑陋,我不想发表评论。

在ASP.NET MVC中,V代表View,所以继续使用它们。控制器操作的目的是获取模型并将此模型传递给视图以进行投影:

public ActionResult GetTRAsString(string appID)
{
    IEnumerable<Revision> revisions = ... go get your revisions from the DB or something
    return PartialView(revisions);
}

然后您的视图将强烈输入模型,您将在其中生成必要的标记:

@model IEnumerable<Revision>
<ul>
    @foreach (var revInfo in Model)
    {
        <li>
            @revInfo.RevDesc
        </li>
    }
</ul>

答案 1 :(得分:9)

试试这个:

var html = "";
$.ajax({
    url: "/PartialView/GetTRAsString",
    method: 'GET',
    data: {appId: appID },
    success: (resp){
        html = resp.html;
    }
});

然后你的行动方法将是:

public JsonResult GetTRAsString(string appID)
{
    // Populate revisions
    string html = "<ul>";

    foreach(RevesionInfo revInfo in revisions)
    {
        html += "<li>" + revInfo.RevDesc + "</li>";
    }

    html += "</ul>";

    return Json(new {html});
}

答案 2 :(得分:8)

使用AJAX的另一个解决方案 -

控制器操作 -

    public ActionResult GetString(string input)
    {
        return Content(input + ", Hello!!!");
    }

查看 -

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
    $(function () {
        $('#click1').click(function (e) {
            $.ajax({
                url: "@Url.Action("GetString")",
                type: "GET",
                dataType: "json",
                data: {
                    input: 'John'
                },
                error: function (response) {
                    alert(response.responseText);
                },
                success: function (response) {
                    alert(response);
                }
            });
        });
    });
</script>
<input type="button" value="Click Me" id="click1" />

当您点击 -

enter image description here

答案 3 :(得分:1)

建议返回JSONResult,因为这是最常见的做法,例如使用模仿引擎,如Mustache,或者其他任何东西,而不只是在服务器端的值中填充手工模板。

像这样:

服务器的东西:

public JSONResult ActionName()
{
   var result=new { Success="False", Message="Error Message"};
   return Json(result, JsonRequestBehavior.AllowGet);
}

客户端的东西:

var template = "<h1>{{your property values here}}</h1>", 
    html = '';

$('#sampleArea').html(html);
    $.getJSON('YourController/ActionName', function(data) {
         html = Mustache.to_html(template, data);
    });

以上更多信息:

  1. http://coenraets.org/blog/2011/12/tutorial-html-templates-with-mustache-js/
  2. http://shashankshetty.wordpress.com/2009/03/04/using-jsonresult-with-jquery-in-aspnet-mvc/