2009-08-14 11 views
2

現在、MVCでサンプルアプリケーションを開発中です。仕様は次のとおりです。
1.グリッドの単一部分図です。
2.ドメインオブジェクトのリストにモデルが文字列で入力され、グリッドに何かを渡すことができます。
3.このビューを任意のページにドロップし、いくつかの属性を持つコントローラを装飾できます。/prevアクション。
4.ページングアクションは別のコントローラに渡され、メインコントローラに戻されます。HandleUnknownActionの別のコントローラにリクエストを渡す

私はHandleUnknownAction内の別のコントローラに制御を引き渡すと、これは感覚

を行い、発信者に

希望を私のモデルを投入するために、この他のコントローラからの結果と戻ってくるにはどうすればよい、私の質問は次のようになり仮定します

リッチ

答えて

0

私は、限られた寿命のために結果を戻すためにTempDataを使用することを推奨します。

他のコントローラへのハンドオフ制御は、無数の方法で行うことができます。

一つはあるかもしれない

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

もう一つの可能​​性:

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

HTH、

ダン

+0

こんにちはダン ご返信ありがとうございます。私の問題は、HandleUnknownActionでグリッド要求を処理することです。このリクエストをGridControllerに渡して、この呼び出しからGridModelを返して、現在のコントローラのGridModelを更新したいと思います。私はGridModelをどこに格納するかについて混乱していると思います。本当に私はそれがgridControllerに格納され、呼び出し元のコントローラに必要なときにアクセスできるようにします。私の目標は、グリッドコントローラーがANYコントローラーを介して処理するグリッド要求のすべての要求を持つことです。 私は意味を作っていることを願っています –

0

私が正しくあなたを理解していれば、あなたは同じことを再利用する必要があります他のいくつかのコントローラのグリッドコントローラからのロジック。これは、異なるコントローラによって処理される異なるaspxページに部分的なビューを配置するためです。ただし、この部分ビューは、Grid Controllerとこのビューを作成した特定のコントローラによって処理される必要があります。たとえば、HomeControllerにはIndexメソッドがあり、その中にグリッドがあるIndex.aspxを表示します。ユーザーがgird pageボタンを押すと、HomeController HandleUnknownActionメソッドが起動し、GridControllerロジックを使用してページング要求を処理する必要があります。

これが正しいとすれば、GridControllerから私のすべてのコントローラでデリバリーして、ページングメソッドを仮想化して、HomeControllerをオーバーライドできるようにします。例えば

は: GridControllerは、パブリックメソッドを持つ仮想のActionResult NEXTPAGE()」にHomeControllerがあります。

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

あなたはあまりにも多くの追加のコーディングなしで両方のコントローラを実行することができますこの方法

+0

譲渡を超える継承 - 葉のクラスの目的に関連しているかもしれないし、そうでないかもしれない論理へのアクセスを提供するために継承階層に別の層を強制することがデザインの匂いです。あなたの解決策は、HomeControllerはGridControllerだと言っていますが、HomeControllerにはグリッドを表示するアクションが含まれています。 – Neal

0

私はあなたがいると思います。間違ったアスペクトを使用して作業を実行しようとすると、達成するのは苦労します。

オブジェクトのコレクション全体を取得してサブセットをレンダリングするのは非常に無駄です。hあなたのユーザーがすべてのページを見ていることは分かっていますか? 10,000のオブジェクトがある場合はどうなりますか?

データベースから2つの情報、オブジェクトの最初のページ、オブジェクトの総数を取得する必要があります。これはコントローラから処理する必要があります(できれば直接別の日の議論である)。必要なレンダリングヘルパーを含むクラスにその情報をパッケージ化し、そのクラスをビューに送信します。オブジェクト数とページサイズが与えられれば、新しいページ番号を渡すアクションにポストバックする簡単なナビゲーションリンクを構築することができます。部分的...

<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> 

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) %> 

注意してください、示されたすべてのコードはaircodeであり、動作することは保証されていません。一連の概念を示しています。

関連する問題