Asp.net mvc 如何在控制器中获取ActionResult返回的html

Asp.net mvc 如何在控制器中获取ActionResult返回的html,asp.net-mvc,ajax,json,Asp.net Mvc,Ajax,Json,我正在尝试实现一个类似于StackOverflow相关问题的功能,我是在MVC中实现的 $().ready(function() { var s = $("#Summary").val(); $("#Summary").blur(function() { QuestionSuggestions(s); }); }); function GetPastIssues(title) { $(document).ready(function() { $.ajax({ type: "POS

我正在尝试实现一个类似于StackOverflow相关问题的功能,我是在MVC中实现的

$().ready(function() {
   var s = $("#Summary").val();
   $("#Summary").blur(function() { QuestionSuggestions(s); });
});

function GetPastIssues(title) {

$(document).ready(function() {
$.ajax({ type: "POST",
    url: "/Issue/GetSimilarIssues",
    contentType: "application/json; charset=utf-8",
    dataType: "xml",
    dataType: "json",
    data: "{'title':'" + title + "'}",
    processData: false,
    error: function(XMLHttpRequest, textStatus, errorThrown) { ajaxError(XMLHttpRequest, textStatus, errorThrown); },
    success: function(xml) { ajaxFinish(xml); }
  });
});

function ajaxFinish(xml) {
 if (xml.d != "NO DATA") {
    $('#question-suggestions').html(xml.d); //alert(xml.d); // This ALERT IS returning undefined
    $('#question-suggestions').show();
 }
}
从我的控制器返回的数据是“未定义的”,如ajaxFinish中的注释行所示。
我做错了什么?

//[AcceptVerbs(HttpVerbs.Get)]
[JsonParamFilter(Param = "title", TargetType = typeof(string))]
public ActionResult GetSimilarIssues(string title)
{
    var issues = _db.GetSimilarIssues(title).ToList();
    if (title == null || issues.Count() == 0)
       return Json("NO DATA");

    string retVal = null;
    foreach (Issue issue in _db.GetSimilarIssues(title))
    {
        retVal += "<div class='answer-summary' style='width: 610px;'>";
        retVal += "<a href='Issue.aspx?projid=" + issue.ProjectId.ToString() + "&issuetypeid=" + issue.IssueTypeId.ToString() +
                "&issueid=" + issue.IssueId.ToString() + "'>";
        retVal += issue.Summary;
        retVal += "</a>";
        retVal += "</div>";
    }
        return Json(retVal);
  }
看起来像视图文件夹中的“搜索”文件夹和名为“标题”的部分视图。使用以下方法搜索控制器.cs:

public ActionResult titles(string like)
{
   // HOW TO IMPLEMENT THIS
   return PartialView("Titles");
}

Titles.ascx中显示html的内容是什么?

JSON()的目的是返回一个JSON对象,而不是html。JSON对象类似于{html_值:“
  • blah”}。我不确定您的ajax请求期望的是什么。如果它需要JSON(您已经设置了两次数据类型),那么您可以对匿名对象执行以下操作:

    return Json(new {html_value = retVal});
    
    但是,如果您想从控制器返回HTML,请不要返回。这正是视图的作用。创建一个没有任何母版页的视图,以这种方式循环并返回HTML。Ajax应用程序可以接收此HTML并在必要时删除它

    事实上,虽然从技术上讲,您可以执行上述匿名对象(在json对象中返回html),但这不是它的用途。如果要使用JSON,则应返回值,并让客户端上的javascript对其进行格式化:

    我不确定您的问题对象有多“重”,但假设它只有您正在使用的三个字段。在这种情况下,请执行以下操作:

    return Json(issues);
    
    编辑

    我认为“最佳实践”是通过JSON和javascript中的格式返回值。我对JSON()不太熟悉,但我知道它是有效的(我用它做一些简单的事情)。尝试使用这三个值和

    return Json(issuesTxfr);
    
    当您从控制器调用时,不需要使用PartialView。把它想象成一个非常简单的视图。下面是我的一个例子(请不要注意,我没有遵循我自己的JSON建议——这是很久以前的建议,我现在因为几个原因而畏缩):

    
    ******


  • 请注意,没有指定母版页。

    您可以始终以字符串形式返回HTML。我并不是说这是必须的,我同意James Shannon关于不使用JSON返回HTML的观点


    菲尔·哈克(Phil Haack)在5月份的博客上写了一篇关于这一点的精彩文章。

    我已经尝试过返回Json(问题);但由于某种原因,没有得到任何结果。我喜欢让一个新的视图进行循环并生成html的想法,但我不知道如何做到这一点。你能指一下样品吗?感谢我,最佳实践是返回一个Json对象并让视图处理渲染。考虑到我的上述情况,你如何将其连接起来?我不知道如何在控制器中编写该方法,部分视图是什么样子,以及如何加载它。
    return Json(issuesTxfr);
    
        public ActionResult Controls_Search_Ajax(string q, string el)
        {
            ...
    
            ViewData["controls"] = controls;
            ViewData["el"] = el;
    
            return View();
        }
    
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Controls_Search_Ajax.aspx.cs" Inherits="IRSoxCompliance.Views.Edit.Controls_Search_Ajax" %>
    <% var controls = ViewData.Get<IEnumerable<IRSoxCompliance.Models.Control>>("controls");
       var el = ViewData.Get<String>("el");
    
       if (controls != null)
       {
         foreach (var c in controls)
         {
    %><%= c.Control_ID %>***<%= c.Full_Control_Name %>***<li id="<%= el %>:li:<%= c.Control_ID %>"><span class="item"><%= Html.BreadCrumb(c, false) %></span><span class="actions"><a href="#" onclick="sx_Remove_Control('<%= el %>', <%= c.Control_ID %>); return false;">Remove</a></span><br></li>
    <%   }
       }
    %>