【问题标题】:MVC3: Return a View Object from a non-Controller classMVC3:从非控制器类返回视图对象
【发布时间】:2018-08-04 23:29:40
【问题描述】:

简而言之,我想通过创建一个静态类来简化我的一些 MVC 页面,以从某种数据存储中获取数据,然后根据一些内部标志返回多个视图之一。

internal static class StaticPageContent
{
    internal static ViewModels.Display GetPage(string Map = null, int? ID = null) {...}
    internal static ActionResult ReturnView(ViewModels.CMS.Display vm) {...}
}

然后,在我的任何控制器操作中,我都可以这样称呼它:

public ActionResult ActionName()
{
    var vm = StaticPageContent.GetPage("/Home");
    return StaticPageContent.ReturnView(vm);
}

ReturnView() 方法将返回多个(共享)视图之一:

internal static ActionResult ReturnView(ViewModels.CMS.Display vm)
{
    if (vm.useLoremIpsum)
        return View("LoremIpsum", vm);
    else
    {
        if (vm.canEdit)
            return View("ViewReadWrite", vm);
        else
            return View("ViewReadOnly", vm);
    }
}

从非控制器类返回 View(...) 对象的正确方法是什么?由于 View(...) 是 Controller 类的一部分,因此上述内容无法编译。


注意: 我相信我得到了这样的工作,但对我时间的要求让我转向了另一个方向。我希望能够重新打开这个项目,看看我做了什么并将其发布在这里。敬请期待!

【问题讨论】:

标签: asp.net-mvc-3


【解决方案1】:

简单地说,正确的方法是不要在静态类中这样做。 (当然是国际海事组织)。特别是如果您正在获取“来自数据存储的数据” - 这不应该是静态的。

在我看来,在基本控制器中创建一个受保护的方法,或者使用子操作并使用Html.Action 将它们呈现出来。

【讨论】:

  • 我已经有一段时间没有访问这个问题了。只是一个好奇的问题 - 为什么你认为静态类在这种情况下不好?我确实知道它是一个单身人士,可能会成为瓶颈。除此之外还有什么?我的意图是基本上用来自数据源的数据填充编辑器或只读页面。整个站点的视图定义将是相同的(跨各种路由​​)。我基本上只是在寻找一种简单的方法来编写可在整个站点上使用的单个通用视图。 :)
  • @KeithBarrows - 是的,单身是原因之一。另一个是松耦合——静态类不能在接口后面实现,因此不能轻易换出或进行单元测试。
  • 我创建了一个基本控制器。在我开始为该页面编写真正的数据绑定魔法之前,“静态视图”基本上是一种填充物。换句话说,我可以创建一个包含很多“Ipsum Lorem”页面的网站,然后开始为每个页面构建逻辑,这样我的客户就可以看到正在取得的进展,并且仍然对最终的虚拟网站有感觉数据。
【解决方案2】:

只是实例化一个,虽然我不认为我会推荐这个。

http://msdn.microsoft.com/en-us/library/system.web.mvc.viewresult.aspx

var result = new ViewResult(){
    ViewName = "ViewReadWrite"
}
result.ViewData.Model = vm; // ViewData may need to be instantiated first.

return result;

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 2021-10-23
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2020-02-18
    • 2015-10-15
    相关资源
    最近更新 更多