如果我想使用MVC返回contentType来使用属性,那么在OnResultExecuting或OnResultExecuted中执行它会更好吗?

时间:2013-01-02 23:21:54

标签: asp.net-mvc-3 actionfilterattribute

在追求解决一个荒谬的问题时,我需要在我的查询字符串中添加一个值(在javascript中执行该操作)并测试它是否存在于服务器上(因为这可能来自ajax或iframe,所以没有标题遗憾的是,我正试图避免在我的<form>元素中添加值。为此,我设计了这个小片段,我不知道在哪里放置“setter”块:

using System.Web.Mvc;

namespace Company.Client.Framework.Mvc
{
  class CreateFormDialogResponseAttribute : ActionFilterAttribute
  {
    private bool SetContentType { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        SetContentType = !filterContext.HttpContext.Request.Params["FormDialogRequest"].IsEmpty();

        base.OnActionExecuting(filterContext);
    }
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    { 
        //do I set it here? (A)
        if (SetContentType)
            filterContext.HttpContext.Response.ContentType = "text/json";
        base.OnResultExecuting(filterContext);
    }
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        //do I set it here? (B)
        if (SetContentType)
            filterContext.HttpContext.Response.ContentType = "text/json";
        base.OnResultExecuted(filterContext);
    }
  }
}

如果我将其设置为(A),那么似乎客户端仍然有时间“覆盖”该属性,如果需要的话。而(B)看起来像“我不在乎你认为你想做什么”的位置。这是一个准确的理解吗?

1 个答案:

答案 0 :(得分:0)

自答案:

因为我需要覆盖ActionResult本身设置的值,所以我必须在方法之后进入,因为它已经完成了它的工作。因为我想避免开发人员手动设置类型的情况,我正在进行两次检查,一次检查是否应该设置它,一次检查它是否是“application / json”(默认值)。