【问题标题】:Create ViewData outside Controler in MVC在 MVC 中的 Controller 外部创建 ViewData
【发布时间】:2015-04-29 09:33:26
【问题描述】:

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

private void CreateFKViewData(OSQDCOL osqdcol, OSADCOL osadcol, IList<OSADCOL> targetTBLcols)
{
        ...
ViewData[osadcol.ColName] = new SelectList(SelectListItems, "key", "value", SelectListItems.First().Key);
}

如果将该方法放在控制器内,一切都会按预期工作。我想将该方法移到我的控制器之外,并将其放入我的 BLL 层中的不同类中。问题是 ViewData 在控制器范围之外是不可访问的。

有什么想法吗?

【问题讨论】:

    标签: model-view-controller controllers viewdata


    【解决方案1】:

    我假设您使用的是 ASP.NET MVC 和 C#。不确定将控制器通常会在控制器之外的类中传播的问题是一个好主意,但足以说明您的问题的原因是 ViewData 是由控制器类继承自 Controller 的事实提供的反过来继承自 ControllerBase (这是提供 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 将所需的任何内容注入到 Controller 的构造函数中,然后以类似的方式从那里执行所需的任何操作。如果这对您不起作用,您可能会考虑不使用 ViewData 构造,而是使用 ViewModel 模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2011-07-07
    相关资源
    最近更新 更多