我的项目使用Castle Monorail作为MVC框架。问题是Monorail要求所有控制器都有一个视图模板。我试图通过AJAX调用从控制器上的方法返回一个字符串。 AJAX GET始终从服务器返回500错误,因为Monorail无法找到视图模板。我已经看到了其他解决方法的例子,你只需要将控制器方法的返回类型设置为void(这表示单轨道没有找到视图控制器),然后做类似的事情:
Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
只需将上下文写入屏幕即可。
所以我有follow方法,并试图通过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读取返回值?
答案 0 :(得分:1)
所有派生的单轨控制器都可以访问名为“CancelView()”的方法。在您希望返回的方法中执行此方法,而不使用视图模板。
答案 1 :(得分: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让事情变得更容易阅读。