将请求传递给HandleUnknownAction上的另一个控制器

时间:2009-08-14 10:04:39

标签: asp.net-mvc

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

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

希望这是有道理的

3 个答案:

答案 0 :(得分:0)

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

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

一个可能是

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

另一个可能是:

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

HTH,

答案 1 :(得分:0)

如果我理解正确,您需要在其他几个控制器中重复使用Grid控制器中的相同逻辑。这是因为您将局部视图放入由不同控制器处理的不同aspx页面。但是,该局部视图应该由网格控制器和产生该视图的特定控制器提供。例如,你有HomeController,它有Index方法,它会在你的网格中显示Index.aspx。当用户按下网格页面按钮时,它应该启动HomeController HandleUnknownAction方法,该方法应该使用GridController逻辑来提供分页请求。

如果这是正确的,我会在GridController的所有控制器中运行,然后我会将分页方法设为虚拟的,这样你就可以覆盖HomeController。

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

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

这样您就可以在没有太多额外编码的情况下运行两个控制器。

答案 2 :(得分:0)

我认为你正在尝试使用错误的方面来完成工作,这就是为什么你会发现它很难实现。

获取整个对象集合然后渲染它们的子集是非常浪费的,您如何知道您的用户将查看所有页面?如果有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>

请注意,所有显示的代码均为空气码,不保证可以正常使用,只是展示了一系列概念。