我目前正在开发MVC中的示例应用程序。规范如下:
1。网格的单个局部视图。
2。该模型将以字符串形式键入域对象列表,以便我可以将任何内容传递给网格
3。我可以将此视图放入任何页面并使用一些属性来装饰控制器,我可以处理典型的页面next / prev操作。
4。寻呼动作将被传递给另一个控制器并传回主控制器。
我想我的问题是,如何将控制权交给HandleUnknownAction中的另一个控制器,然后从另一个控制器返回结果,在调用者中填充我的模型
希望这是有道理的
富
答案 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>
请注意,所有显示的代码均为空气码,不保证可以正常使用,只是展示了一系列概念。