0

我的项目使用 Castle Monorail 作为 MVC 框架。问题是 Monorail 要求所有控制器都有一个视图模板。我正在尝试通过 AJAX 调用从控制器上的方法中获取字符串。AJAX GET 总是从服务器返回 500 错误,因为 Monorail 找不到视图模板。我已经看到了其他解决方法的示例,在这些示例中,您只需将控制器方法的返回类型设置为 void(这表明 monorail 不会费心寻找视图控制器),然后执行以下操作:

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 读取返回值?

4

2 回答 2

1

所有派生的单轨控制器都可以访问一个名为“CancelView()”的方法。在您希望返回的方法中执行此方法,而不使用视图模板。

于 2009-08-31T17:10:18.757 回答
0

您可以为此使用 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";
    }
}

另一个建议 - 打乱 if/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;
}

这样代码以保障(前置条件)开始,方法中的最后一个return语句代表正常执行完成。IMO 它使事情更容易阅读。

于 2009-09-02T05:15:43.987 回答