2009-08-14 3 views
2

В настоящее время я разрабатываю пример приложения в MVC. Спецификация такова:
1. Единый частичный вид сетки.
2. Модель будет строго набрана в список объектов домена, чтобы я мог передать что-либо в сетку
3. Я могу отбросить этот вид на любую страницу и украсить контроллер некоторыми атрибутами, с которыми я могу справиться с типичной страницей следующего/prev.
4. Действия подкачки будут переданы другому контроллеру и переданы обратно на главный контроллер.Передайте запрос другому контроллеру на HandleUnknownAction

Я полагаю, мой вопрос будет, Как передавать управление другим контроллера в пределах HandleUnknownAction и возвращаются с результатом от этого другого контроллера, чтобы заполнить мою модель в вызывающем

Надеются, что это имеет смысл

Rich

ответ

0

Я бы предложил использовать TempData для обработки результата обратно из-за ограниченного срока службы.

Передача управления другому контроллеру может быть выполнена множеством способов.

Можно быть

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

Другой может быть:

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

HTH,

Dan

+0

Hi Dan Спасибо за ваш ответ. Моя проблема в том, что я обрабатываю запросы сетки в HandleUnknownAction. Я хотел бы передать этот запрос в GridController и вернуть GridModel из этого вызова, а затем обновить GridModel в моем текущем контроллере. Я думаю, я смущаюсь о том, где хранить GridModel. На самом деле я хочу, чтобы он хранился в gridController, а затем имел доступ к нему, когда это необходимо в контроллере вызывающего абонента. Моя цель - получить все запросы на запросы сетки, обрабатываемые gridcontroller через ЛЮБОЙ контроллер. Надеюсь, что я нахожу смысл. – 2009-08-17 09:34:55

0

Если я вас правильно понял, вы должны повторно использовать то же самое логики от контроллера Grid в нескольких других контроллерах. Это связано с тем, что вы размещаете частичный вид на разные страницы aspx, которые обрабатываются разными контроллерами. Однако это частичное представление должно обслуживаться контроллером Grid и конкретным контроллером, который создал это представление. Например, у вас есть 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 части информации из базы данных, первую страницу объектов и счетчик общего количества объектов - это должно быть обработано с вашего контроллера (желательно путем вызова в какой-либо форме обслуживания, а не непосредственно к базе данных, но это аргумент за другой день). Упакуйте эту информацию в класс, который содержит любые вспомогательные средства рендеринга, которые вам нужны, и отправьте этот класс в представление. Учитывая количество объектов и размер страницы, вы можете создавать простые навигационные ссылки, которые возвращаются к действию, передающему новый номер страницы.

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> 

Пожалуйста, обратите внимание, весь показанный код - это воздушный код и не гарантированно работает, меня полагайтесь на ряд концепций.

Смежные вопросы