Как вызвать метод в контроллере из представления и вернуть объекты - PullRequest
0 голосов
/ 18 июня 2011

У меня есть приложение MVC, у которого есть контроллер, который имеет рекурсивный метод, который возвращает IEnumerable

public static IEnumerable<Category> GetSubCategoriesFor(int catId)
    {
        var subs = _db.Category.Where(c => c.parrent_id == catId);

        foreach (var sub in subs)
        {
            yield return sub;

            // Recursive call
            foreach (var subsub in GetSubCategoriesFor(sub.category_id))
            {
                yield return subsub;
            }
        }

Суть в том, что мне нужно мое представление, чтобы показать все категории, подкатегории и вопросы в подкатегориях (Этоquestionnarie)

Итак, мой вопрос, как я могу вызвать этот метод из моего представления ??

Я видел несколько примеров, где они используют Html.Action, но я не могу перебрать строку или void

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Этот GetSubCategoriesFor метод, кажется, выравнивает вашу иерархическую структуру, возвращая список, который смешивает категории, подкатегории, ...

Лично я бы использовал шаблоны отображения.Например, если у меня есть следующая модель представления:

public class CategoryViewModel
{
    public int Id { get; set; }
    public IEnumerable<string> Questions { get; set; }
    public IEnumerable<CategoryViewModel> Subcategories { get; set; }
}

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

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new[]
        {
            new CategoryViewModel
            {
                Id = 1,
                Questions = new[] { "q1.1", "q1.2" },
                Subcategories = new[]
                {
                    new CategoryViewModel
                    {
                        Id = 2,
                        Questions = new[] { "q2.1" }
                    },
                    new CategoryViewModel
                    {
                        Id = 3,
                        Questions = new[] { "q2.2", "q2.3" }
                    },
                }
            },
            new CategoryViewModel
            {
                Id = 4,
                Questions = new[] { "q1.3", "q1.4" },
                Subcategories = new[]
                {
                    new CategoryViewModel
                    {
                        Id = 5,
                        Questions = new[] { "q2.4" }
                    },
                }
            },
        };
        return View(model);
    }
}

, а затем мой ~/Views/Home/Index.aspxпредставление будет выглядеть так:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.CategoryViewModel>>" 
%>
<ul>
    <%= Html.DisplayForModel() %>
</ul>

, а затем я бы определил шаблон отображения для категории (~/Views/Home/DisplayTemplates/CategoryViewModel.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.CanalViewModel>" 
%>
<li>
    <div>
        <h3><%= Html.DisplayFor(x => x.Id) %></h3>
        <%= Html.DisplayFor(x => x.Questions) %>
    </div>
    <ul>
        <%= Html.DisplayFor(x => x.Subcategories) %>
    </ul>
</li>

Теперь это ASP.NET MVC с шаблонамипомощники, которые позаботятся о циклическом просмотре древовидной структуры категорий и отобразят содержимое в представлении.Вы можете расширить это, определив комплекс QuestionViewModel вместо строки, которую я использовал, и определив шаблон отображения для этого вопроса ~/Views/Home/DisplayTemplates/QuestionViewModel.ascx, который будет отображаться для каждого элемента свойства Questions категории.

0 голосов
/ 19 июня 2011

Если у вас будет неизвестное количество итераций, вам понадобится HTML Helper.

Учебник * MSDN 1006 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...