我的项目是使用城堡单轨作为MVC框架。问题是,单轨要求所有的控制器具有视图模板。我试图通过Ajax调用得到一个字符串从一个控制器上的方法了。在AJAX GET始终从服务器返回500错误,因为单轨无法找到一个视图模板。我已经看到在其中只设置控制器方法的返回类型为void解决方法的其他例子(这个信号单轨不打扰找到一个视图控制器),然后做类似:

Context.Response.OutputStream.Write(buffer, 0, buffer.Length);

要只写的上下文到屏幕上。

所以我有后续的方法,我试图通过一个jQuery AJAX GET来获取返回的字符串。有人可以帮忙吗?

 public void Note(string id)
    {
        if (!string.IsNullOrEmpty(id))
        {
            if (notesProvider.HasNote(id))
            {
                return "{status:'200', text: '" + notesProvider.GetNote(id).Body + "'}";

            }
            else return "{status:'404', text: 'Could not find the Note by provided id [" + id + "]'}";
        }
        else return "{status:'500', text: 'Illegal request : a note id must be provided'}";
    }
}

我应该如何使这个返回空隙,并通过读取返回值的HttpContext?

有帮助吗?

解决方案

所有衍生单轨控制器可以使用一个方法叫做“CancelView()”。您希望不通过视图模板返回该方法中执行此方法。

其他提示

可以使用JsonReturnBinder为:

[return:JSonReturnBinder]
public object Note(string id)
{
    if (!string.IsNullOrEmpty(id))
    {
        if (notesProvider.HasNote(id))
        {
            return new {status=200, text= notesProvider.GetNote(id).Body };
        }
        else return new {status=404, text="Could not find the Note by provided id [" + id + "]" };
    }
    else return new {status =500, text="Illegal request : a note id must be provided" };
}

细化建议:

为什么返回的状态代码作为响应身体的一部分?有在任何响应的HttpStatusCode字段。将其设置为所需的代码将使得客户端代码更容易使用(你可以检查直接在XMLHttpRequest的状态代码,大多数JS库有专门的成功处理程序和错误),再加上你的方法将返回所需的字符串,那么单元测试就好办多了。例如:

[return:JSonReturnBinder]
public string Note(string id)
{
    if (!string.IsNullOrEmpty(id))
    {
        if (notesProvider.HasNote(id))
        {
            return notesProvider.GetNote(id).Body;
        }
        else 
        {
            Response.StatusCode = 404;
            return "Could not find the Note by provided id [" + id + "]";
        }
    }
    else 
    {
        Response.StatusCode = 500;
        return "Illegal request : a note id must be provided";
    }
}

另一个建议 - 洗牌如果/ else块来降低嵌套级:

[return:JSonReturnBinder]
public string Note(string id)
{
    if (string.IsNullOrEmpty(id))
    {
        Response.StatusCode = 500;
        return "Illegal request : a note id must be provided";
    }

    if (notesProvider.HasNote(id) == false)
    {
        Response.StatusCode = 404;
        return "Could not find the Note by provided id [" + id + "]";
    }

    return notesProvider.GetNote(id).Body;
}

此方式,代码开头的保障(前置条件),以及在该方法中的最后一个返回语句代表正常执行完成。 IMO它使事情更容易阅读。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top