Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 通过HandleUnknownAction将请求传递给另一个控制器_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 通过HandleUnknownAction将请求传递给另一个控制器

Asp.net mvc 通过HandleUnknownAction将请求传递给另一个控制器,asp.net-mvc,Asp.net Mvc,我目前正在用MVC开发一个示例应用程序。规格如下: 1。栅格的单个局部视图。 2。该模型将被严格输入到域对象列表中,以便我可以将任何内容传递到网格 3。我可以将此视图放到任何页面中,并使用一些属性装饰控制器,我可以处理典型的页面下一页/上一页操作。 4。分页操作将传递给另一个控制器,并传递回主控制器 我想我的问题是,如何将控制权交给HandleUnknownAction中的另一个控制器,并从另一个控制器返回结果,以在调用者中填充我的模型 希望这有意义 Rich我建议使用TempData来处理返回

我目前正在用MVC开发一个示例应用程序。规格如下:
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);
}
萨默尔