Asp.net mvc 通过HandleUnknownAction将请求传递给另一个控制器
我目前正在用MVC开发一个示例应用程序。规格如下:Asp.net mvc 通过HandleUnknownAction将请求传递给另一个控制器,asp.net-mvc,Asp.net Mvc,我目前正在用MVC开发一个示例应用程序。规格如下: 1。栅格的单个局部视图。 2。该模型将被严格输入到域对象列表中,以便我可以将任何内容传递到网格 3。我可以将此视图放到任何页面中,并使用一些属性装饰控制器,我可以处理典型的页面下一页/上一页操作。 4。分页操作将传递给另一个控制器,并传递回主控制器 我想我的问题是,如何将控制权交给HandleUnknownAction中的另一个控制器,并从另一个控制器返回结果,以在调用者中填充我的模型 希望这有意义 Rich我建议使用TempData来处理返回
1。栅格的单个局部视图。
2。该模型将被严格输入到域对象列表中,以便我可以将任何内容传递到网格
3。我可以将此视图放到任何页面中,并使用一些属性装饰控制器,我可以处理典型的页面下一页/上一页操作。
4。分页操作将传递给另一个控制器,并传递回主控制器 我想我的问题是,如何将控制权交给HandleUnknownAction中的另一个控制器,并从另一个控制器返回结果,以在调用者中填充我的模型 希望这有意义
Rich我建议使用TempData来处理返回结果的问题,因为它的生命周期有限 将控制权移交给另一个控制器可以通过多种方式完成 一个可能是
重定向(“/Controller/Action/SomePrametersToKnow/WhereToReturnTo”)
另一个可能是:
var controller - new OtherController();
controller.ActionMethod(parameters)
嗯,
Dan我建议使用TempData来处理返回结果的问题,因为它的生命周期有限 将控制权移交给另一个控制器可以通过多种方式完成 一个可能是
重定向(“/Controller/Action/SomePrametersToKnow/WhereToReturnTo”)
另一个可能是:
var controller - new OtherController();
controller.ActionMethod(parameters)
嗯,
Dan如果我理解正确,您需要在其他几个控制器中重用来自Grid controller的相同逻辑。这是因为您将部分视图放置到由不同控制器处理的不同aspx页面中。但是,该部分视图应由网格控制器和生成该视图的特定控制器提供服务。例如,您有一个HomeController,它有一个索引方法,在其中显示Index.aspx和您的网格。当用户按下网格页面按钮时,它应该启动HomeController HandleUnknownAction方法,该方法应该使用GridController逻辑来服务分页请求 如果这是正确的,我将从GridController中删除所有控制器,然后将分页方法设为虚拟方法,以便您可以覆盖它HomeController 例如: GridController具有方法public virtual ActionResult NextPage()”。HomeController具有:
public override ActionResult NextPage()
{
base.NextPage();
}
通过这种方式,您可以运行两个控制器,而无需太多额外的编码。如果我理解正确,您需要在其他几个控制器中重用来自Grid controller的相同逻辑。这是因为您将部分视图放置到由不同控制器处理的不同aspx页面中。但是,此部分视图应该由网格控制器和生成此视图的特定控制器提供服务。例如,您有HomeController,其中的Index方法显示包含网格的Index.aspx。当用户按下网格页面按钮时,它应启动HomeController HandleUnknownAction方法,该方法应使用GridController逻辑为pagi提供服务拒绝请求 如果这是正确的,我将从GridController中删除所有控制器,然后将分页方法设为虚拟方法,以便您可以覆盖它HomeController 例如: GridController具有方法public virtual ActionResult NextPage()。HomeController具有:
public override ActionResult NextPage()
{
base.NextPage();
}
通过这种方式,您可以运行两个控制器,而无需太多额外的编码。我认为您试图使用错误的方面来完成工作,这就是为什么您感到很难实现的原因 获取整个对象集合,然后呈现其中的一个子集是非常浪费的,您如何知道您的用户将查看所有页面?如果有10000个对象呢 您希望从数据库中检索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()
{
}
}
公共类GridView
{
专用词典(p.ProductName);
AddColumn(“Price”,p=>p.Price.ToString(“c”);
AddColumn(“库存中”,p=>p.StockLevel.ToString());
返回视图(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>
显示第页,共页
|
请注意,所显示的所有代码都是aircode,不保证有效,只是演示了一系列概念。我认为您试图使用错误的方面来完成工作,这就是为什么您感到难以实现的原因 获取整个对象集合,然后呈现其中的一个子集是非常浪费的,您如何知道您的用户将查看所有页面?如果有10000个对象呢 您希望从数据库中检索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()
{
}
}
公共类GridView
{
专用词典(p.ProductName);
AddColumn(“Price”,p=>p.Price.ToString(“c”);
AddColumn(“库存中”,p=>p.StockLevel.ToString());
返回视图(gridData);
}
萨默尔