操作过滤器仅加载某些操作类型的数据

时间:2014-04-02 02:05:30

标签: c# asp.net-mvc filter action onactionexecuting

我对MVC的处理方式相对较新,并且由于在基本控制器中加载了大量无关数据而遇到了一些性能问题。我已经阅读了一些关于动作过滤器的内容,并且想知道是否有人有关于如何继续的建议。这是我的问题:

我有一个名为RegController的Controller,它继承自一个名为BaseController的基本控制器。在基本控制器的onActionExectuting方法中,我加载了几个变量等,这些变量将在可视化页面中使用,例如viewbag,viewdata等。我只需要为结果类型为ActionResult的Actions加载这些东西。在同一个RegController中,我还有一些JsonResult动作,它们不需要加载所有这些额外信息,因为它们不加载页面或视图模板,它们只返回Json。有没有人建议如何在现有框架功能中正确处理?我应该将这些动作放在不同的控制器中吗?我有许多具有不同功能的控制器以同样的方式分开,我希望我可以过滤动作类型,而不是将它们全部移动到JsonResultController或其他任何东西。

下面的代码(其中一些是伪的):

public class BaseController : Controller
{
    protected string RegId;

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (filterContext.ActionParameters.ContainsKey("rid") && filterContext.ActionParameters["rid"] != null)
            RegId = filterContext.ActionParameters["rid"].ToString();

        Reg oReg = new Reg(RegId);

        // IF A VISIBLE PAGE IS BEING SERVED UP, I NEED TO LOAD THE VIEWDATA FOR THE PAGE
        SetViewAndMiscData(oReg);

        // IF THIS IS A JSON RESULT ACTION, I DO NOT WANT TO LOAD THE VIEWDATA FOR THE PAGE
    }
}

public class RegController : BaseController
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
    }

    public ActionResult Page(string id)
    {
        // THE VIEW DATA SHOULD BE SET FROM THE BASECONTROLLER FOR USE IN THE PAGE
        return View();
    }

    public JsonResult Save(string id, string data)
    {
        // I DON"T NEED ALL OF THE VIEW AND MISC DATA LOADED HERE, INCLUDING THE AUTO LOAD
        // OF THE REG OBJECT SINCE I DO IT HERE FROM THE PASSED PARAMS.

        GenericResponseObject Response = new GenericResponseObject();
        Reg oReg = new Reg(id);

        if (!oReg.IsValid)
        {
            Response.Status = 1;
            Response.Message = "Invalid Record";
        }
        else
            Response = oReg.SaveData(data);

        return Json(Response);
    }
}    

0 个答案:

没有答案