如何在MVC3中一起返回状态代码,状态描述和文本?

sha*_*oth 14 .net c# asp.net-mvc-3

从我的MVC3控制器操作,我想返回HTTP 403,将"状态描述"设置为某个特定的字符串,并在结果内容中返回该字符串,以便在浏览器中可见.

我可以返回ContentResult指定内容,但不能指定状态代码(例如403)而不是状态描述.我可以HttpStatusCodeResult用来指定状态代码和状态描述,但不能指定结果内容.

如何制作包含所有三个的动作结果?

drc*_*rch 16

通常,您会通过设置响应代码然后返回常规ActionResult来完成此操作

public ActionResult Foo() 
{ 
    Response.StatusCode = 403;
    Response.StatusDescription = "Some custom message";

    return View(); // or Content(), Json(), etc
}
Run Code Online (Sandbox Code Playgroud)

如果你真的需要这个作为ActionResult,你可以自己创建.

例:

public class HttpStatusContentResult : ActionResult
{
    private string _content;
    private HttpStatusCode _statusCode;
    private string _statusDescription;

    public HttpStatusContentResult(string content, 
                                   HttpStatusCode statusCode = HttpStatusCode.OK,
                                   string statusDescription = null)
    {
        _content = content;
        _statusCode = statusCode;
        _statusDescription = statusDescription;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.StatusCode = (int) _statusCode;
        if (_statusDescription != null)
        {
            response.StatusDescription = _statusDescription;
        }

        if (_content != null)
        {
            context.HttpContext.Response.Write(_content);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果`_statusDescription`为null,你可以为它赋值`HttpWorkerRequest.GetStatusDescription(response.StatusCode)`,它在`string [] [] s_HTTPStatusDescriptions`中的查询非常快,如`s_HTTPStatusDescriptions [StatusCode/100] ] [StatusCode%100]`.检索到的值始终是状态代码的简短描述,例如"OK"或"Forbidden",如果找不到匹配的描述,则为空字符串. (3认同)

And*_*rei 11

如果这不是太脏

Response.Clear();
Response.Write("Some specific string");
return new HttpStatusCodeResult(403, "another specific string");
Run Code Online (Sandbox Code Playgroud)

  • 或类似地,`Response.StatusCode = 403; Response.StatusDescription = "foo" 的; return content("bad request mate");` (2认同)
  • 如果你在代码之前搞乱它,不要忘记先清除响应:`Response.Clear();` (2认同)