1

我的控制器中有两个动作,它们共享负责选择视图的部分逻辑。我怎样才能使这部分在动作中通用。例子:

控制器文件

  • 行动开放

    1. 如果找到一个文档并且类型为 X,则使用 OpenX 视图显示它
    2. 如果找到一个文档并且类型为 Y,则使用 OpenY 视图显示它
    3. 如果找到多个文档,则使用列表视图显示列表
    4. 如果没有找到文档,使用错误视图显示错误
  • 动作 OpenMetaData

    1. 如果找到一个文档,则使用 OpenMetaData 视图显示它
    2. 如果找到多个文档,则使用列表视图显示列表
    3. 如果没有找到文档,使用错误视图显示错误

如您所见,点 3,4 与 2,3 相同

我想创建类似的东西

public DocumentController
{

    public ActionResult Open( ... )
    {
       var dataFromWebService = service.GetData( ... );
       return ViewSelector.GetLaunchView(dataFromWebService);
    }

    public ActionResult Open( ... )
    {
       var dataFromWebService = service.GetData( ... );
       return ViewSelector.GetOpenMetaData(dataFromWebService);
    }
}

public class ViewSelector
{
     public static ActionResult GetLaunchView(DataFromWebService dataFromWebService)
     {
          if( dataFromWebService contains document type X)
              return new ViewResult("OpenX",data);
          if( dataFromWebService contains document type Y)
              return new ViewResult("OpenY",data);
          return CommonLogic(dataFromWebService);
     }

     public static ActionResult GetOpenMetaData(DataFromWebService dataFromWebService)
     {
          ......
     }

     private static ActionResult CommonLogic(DataFromWebService dataFromWebService)
     {
          .... Common logic
     }
}

我想这样做是为了让我的控制器尽可能干净。

我可以在控制器外部创建 ViewResults,将数据附加到它们并在操作中返回它们吗?

这是好还是坏的设计?

也许有人有更好的想法如何处理这个

4

1 回答 1

0

如果您不需要访问控制器的任何上下文,您可以在控制器之外创建结果。在您的情况下,我会考虑将 GetOpenMetaData() 和 GetLaunchView 方法设为控制器的私有方法。

如果您需要跨多个控制器共享它,您还可以考虑将其放入抽象 BaseController 并让您的控制器继承它。

于 2012-07-04T18:36:11.857 回答