如何从View中调用Controller中的方法并返回对象

时间:2011-06-18 19:16:46

标签: asp.net asp.net-mvc-2

我有一个MVC应用程序,它有一个Controller,它有一个返回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;
            }
        }

关键是我需要我的观点来显示子类别中的所有类别,子类别和问题(这是一个问题)

所以我的问题是,如何从我的视图中调用此方法?

我看过他们使用Html.Action的一些例子,但我不能迭代字符串或无效

提前致谢!

2 个答案:

答案 0 :(得分:1)

这个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的每个元素呈现属性。

答案 1 :(得分:0)

如果您要进行未知的迭代次数,则需要使用HTML帮助程序。

Tutorial MSDN