1

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

我有一个名为 RegController 的控制器,它继承自名为 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);
    }
}    
4

0 回答 0