Model view controller 在MVC中在控制器外部创建ViewData

Model view controller 在MVC中在控制器外部创建ViewData,model-view-controller,controllers,viewdata,Model View Controller,Controllers,Viewdata,我在控制器中有一个创建ViewData的方法。比如这个 private void CreateFKViewData(OSQDCOL osqdcol, OSADCOL osadcol, IList<OSADCOL> targetTBLcols) { ... ViewData[osadcol.ColName] = new SelectList(SelectListItems, "key", "value", SelectListItems.First().Key); }

我在控制器中有一个创建ViewData的方法。比如这个

private void CreateFKViewData(OSQDCOL osqdcol, OSADCOL osadcol, IList<OSADCOL> targetTBLcols)
{
        ...
ViewData[osadcol.ColName] = new SelectList(SelectListItems, "key", "value", SelectListItems.First().Key);
}
private void CreateFKViewData(OSQDCOL OSQDCOL、OSADCOL OSADCOL、IList targetTLCOLS)
{
...
ViewData[osadcol.ColName]=新的SelectList(SelectListItems,“key”,“value”,SelectListItems.First().key);
}
如果将该方法放置在控制器中,则一切都会按预期工作。我想将该方法移到控制器之外,并将其放入BLL层中的另一个类中。问题是在控制器范围之外无法访问ViewData


有什么想法吗

我假设您使用的是ASP.NET MVC和C#。不确定将控制器通常会在控制器之外的类中进行的关注点分散开来是不是一个好主意,但只需说明问题的原因是,您的控制器类继承自控制器,而控制器类又继承自ControllerBase,这一事实使得ViewData可用(这就是提供VIEWDATA的地方)。所以,假设您想从控制器中调用另一个类中的方法,并且希望该方法能够操作VIEWDATA。请考虑以下内容:

public class TestController : Controller
{
    // GET: Test
    public ActionResult Index()
    {
        var externalclass = new SomeRandomClass(this);
        externalclass.DoStuff();
        return View();
    }
}

public class SomeRandomClass
{
    ControllerBase _callingController = null;
    public SomeRandomClass(ControllerBase callingController)
    {
        this._callingController = callingController;
    }
    public void DoStuff()
    {
        this._callingController.ViewData["hello"] = "world";
    }
}

这似乎是可行的,但我如何修改它以使用依赖项注入,尤其是autofac?这取决于您如何对控制器使用DI?在我给出的示例中,您可以让IoC将任何需要的东西注入控制器的构造函数中,然后从中执行任何需要的操作如果这对你不起作用,你可能会考虑不使用VIEWDATA结构,而是使用VIEW模型模式。