【问题标题】:How to call a method in a Controller from a View and return objects如何从视图调用控制器中的方法并返回对象
【发布时间】:2011-06-18 19:16:45
【问题描述】:

我有一个 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;
            }
        }

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

所以我的问题是,我怎样才能从我的视图中调用这个方法??

我见过一些使用 Html.Action 的示例,但我无法遍历字符串或 void

提前致谢!

【问题讨论】:

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


    【解决方案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 属性的每个元素呈现。

    【讨论】:

    • 感谢您的回复。递归可以使用这种方法吗?例如,如果一个子类别有子类别,它将显示多少个级别?
    • 这是我的数据库模型的样子:imageshack.us/photo/my-images/59/dbmodel.jpg
    • @Nanek,此方法可以处理的嵌套级别是无限的。您可以拥有任意数量的子子子子类别:-)
    • 如何从我的控制器中填充 ViewModel?如果您查看我提供的链接,您可以看到类名。我使用实体框架来加载我的数据库。对不起我的无知
    【解决方案2】:

    如果您要进行未知数量的迭代,则需要使用 HTML Helper。

    Tutorial MSDN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多