【问题标题】:Pass a request to another controller on HandleUnknownAction将请求传递给 HandleUnknownAction 上的另一个控制器
【发布时间】:2010-09-04 19:47:18
【问题描述】:

我目前正在 MVC 中开发一个示例应用程序。规格如下:
1。网格的单个局部视图。
2。该模型将被字符串输入到域对象列表中,以便我可以将任何内容传递给网格
3。我可以将此视图放到任何页面中,并使用一些属性来装饰控制器,我可以处理典型的页面下一个/上一个动作。
4。分页动作将移交给另一个控制器并传回主控制器。

我想我的问题是,如何将控制权移交给 HandleUnknownAction 中的另一个控制器,并从另一个控制器返回结果以在调用者中填充我的模型

希望这是有道理的

丰富

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我建议使用 TempData 来处理传回结果,因为它的寿命有限。

    可以通过多种方式将控制权移交给另一个控制器。

    可能是

    Redirect("/Controller/Action/SomePrametersToKnow/WhereToReturnTo")

    另一个可能是:

    var controller - new OtherController();
     controller.ActionMethod(parameters)
    

    HTH,

    【讨论】:

    • 嗨丹感谢您的回复。我的问题是我在 HandleUnknownAction 中处理网格请求。我想将此请求传递给 GridController 并从此调用返回一个 GridModel,然后更新我当前控制器中的 GridModel。我想我对存储 GridModel 的位置感到困惑。真的我希望它存储在 gridController 中,然后在调用者控制器中需要时访问它。我的目标是让网格控制器通过任何控制器处理所有对网格请求的请求。我希望我说得通
    【解决方案2】:

    如果我理解正确,您需要在其他几个控制器中重用来自 Grid 控制器的相同逻辑。这是因为您将部分视图放置到由不同控制器处理的不同 aspx 页面中。然而,这个局部视图应该由网格控制器和产生这个视图的特定控制器提供服务。例如,您有 HomeController,它具有 Index 方法,该方法将 Index.aspx 与您的网格一起呈现在其中。当用户按下网格页面按钮时,它应该启动 HomeController HandleUnknownAction 方法,该方法应该使用 GridController 逻辑来服务分页请求。

    如果这是正确的,我会从 GridController 派生所有控制器,然后将分页方法设为虚拟一个,以便您可以覆盖它 HomeController。

    例如: GridController 有方法 public virtual ActionResult NextPage()"。HomeController 有:

    public override ActionResult NextPage()
    {
      base.NextPage();
    }
    

    这样您就可以运行两个控制器而无需过多的额外编码。

    【讨论】:

    • 优先组合优于继承 - 强制另一层进入继承层次结构以提供对可能与叶类目的相关或不相关的逻辑的访问是一种设计味道。您的解决方案说 HomeController 是一个 GridController,但设计说 HomeController 包含一个显示网格的操作 - 两个非常不同的语句。
    【解决方案3】:

    我认为您尝试使用错误的方面来完成工作,这就是为什么您发现实现起来很痛苦。

    获取整个对象集合然后渲染它们的子集非常浪费,您怎么知道您的用户会查看所有页面?如果有 10,000 个对象怎么办?

    您想从数据库中检索 2 条信息、对象的第一页和对象总数的计数 - 这应该从您的控制器处理(最好通过调用某种形式的服务而不是直接调用数据库,但那是另一天的论据)。将该信息打包到一个包含您需要的任何渲染助手的类中,并将该类发送到视图。给定对象数量和页面大小,您可以构建简单的导航链接,这些链接返回到传递新页码的操作。

    public class GridView<T>
    {
      private Dictionary<string, Func<T, string> _columnMap;
    
      public GridView( IEnumerable<T> items, long totalItems, long currentPage )
      {
        Items = items;
        Count = totalItems;
        CurrentPage = currentPage;
      }
    
      public long Count { get; private set; }
      public long CurrentPage { get; private set; }
      public IEnumerable<string> Columns { get; }
      public IEnumerable<T> Items { get; private set; }
    
      public void AddColumn( string name, Func<T, string> data )
      {
        _columnMap.Add( columnName, data );
      }
    
      public string GetColumnValue( string name, T item )
      {
        var valueExtractor = _columnMap[name];
        return valueExtractor(item);
      }
    
      public string GetPageCount()
      {
        // Calculate page count, convert to string and return
      }
    
      // Might be easier to make these two extension methods for the html helper class
      // so that you get easier access to the context of the current action
      public string GetPreviousLink()
      {
      }
    
      public string GetNextLink()
      {
      }
    }
    

    在控制器中...

    // Use the route definition to set the page to default to 1
    public ActionResult ShowProducts( int page )
    {
      // Get the list of products for the requested page
      var currentPageData = ...
      // Get the total number of products
      var productCount = ...
      var gridData = new GridView<Product>( currentPageData, productCount, page );
      gridData.AddColumn( "Name", p => p.ProductName );
      gridData.AddColumn( "Price", p => p.Price.ToString("c") );
      gridData.AddColumn( "In Stock", p => p.StockLevel.ToString());
    
      return View( gridData );
    }
    

    视图中的某处...

    <% =Html.RenderPartial( "GridView", Model ) %>
    

    在部分...

    <table>
    <tr>
    <% foreach( var column in Model.Columns ) { %>
      <th><% =column %></td>
    <% } %>
    </tr>
    <% foreach( var item in Model.Items ) { %>
      <tr>
      <% foreach( var column in Model.Columns ) { %>
        <td><% =Model.GetColumnValue( column, item ) %></td>
      <% } %>
      <tr>
    <% } %>
    <tr>
      <td colspan="<% =Model.Columns.Count %>">Showing Page <% =Model.CurrentPage %> of <% =Model.GetPageCount() %></td>
    </tr>
    <tr>
      <td colspan="<% =Model.Columns.Count %>"><% =Model.GetPreviousLink() %> | <% =Model.GetNextLink() %></td>
    </tr>
    </table>
    

    请注意,所有显示的代码都是空代码,不保证可以正常工作,只是演示了一系列概念。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2021-12-20
      • 2012-05-02
      • 1970-01-01
      • 2011-12-28
      相关资源
      最近更新 更多