【问题标题】:MVC: How can I pass a list from one view to another?MVC:如何将列表从一个视图传递到另一个视图?
【发布时间】:2010-01-10 17:13:18
【问题描述】:

我在一个视图中有一些数据,我想将这些数据传递给子部分视图。该数据的一部分是我想在部分视图中显示的日期列表。我很确定我不能将 IEnumerable 从一个视图传递到另一个视图(当我尝试控制器中的 list 为 null 时)。假设是这种情况,有没有好的解决方法?

我考虑过将这些值连接成一个字符串,然后在控制器中解析该字符串。这似乎有点骇人听闻,但我认为它会起作用。这样做有问题吗?有没有更好的办法?

不得不重新获取我在父视图中获得的数据似乎太可惜了。我希望有另一种方法来做到这一点。

更新: 这是局部视图的模型:

public class SiteVisitDetailModel
{
    public String URL
    {
        get;
        set;
    }

    public List<DateTime> Dates
    {
        get;
        set;
    }
}

这是从父视图添加部分视图的代码:

<% Html.Telerik().PanelBar().Name("PanelBar").HtmlAttributes(new { style = "padding-left: 0em;" }).Items(items =>
{
    foreach (var item in Model.Visits)
    {
        SiteVisitDetailModel model = new SiteVisitDetailModel();
        model.URL = item.Key;
        model.Dates = (from siteVisit in item
                             select siteVisit.Time).ToList();

        items.Add()
            .Text(item.Key.ToString() + " " + item.Count().ToString() + " visits")
            .LoadContentFrom("SiteViewDetail", "Report", model);        

    }
}).Render();

在SiteVisitDetail action方法中,model.URL设置正确,model.Dates为null。

【问题讨论】:

    标签: asp.net-mvc ienumerable


    【解决方案1】:

    如果我正确理解了您的问题...

    如果你的局部视图可以是强类型的,它的模型可以是列表,你可以这样做:

    <%Html.RenderPartial("PartialView",myList);%>
    

    否则,父视图可以将列表添加到其ViewData,这可以从局部视图访问。

    【讨论】:

    • 我只能将列表直接传递给强类型模型吗?如果是这样,如何将列表添加到父级的 ViewData?我已经尝试过 ViewData["test"] = "testing!"和 ViewData.Add("test", "testing!") 在视图本身,以及在返回视图的控制器方法中。这两者在局部视图中都没有任何价值。理想情况下,我只想将列表(或包含列表的模型)传递给返回部分视图的控制器方法。这不可能吗?
    • 由于您的 Partial View SitesViewDetail 现在是一个以SitesViewDetailModel 为模型的强类型视图,您应该能够从中执行Model.Dates。您是否确信在设置 model.Dates 之后它实际上具有值?此外,视图应该尽可能短且甜,并且只表示数据。我会从呈现您上面编写的视图代码的控制器操作中构建我的模型(主视图之一,因此也是部分视图)。
    • 我确定数据存在。如果我在主视图中访问它,它看起来就很好。但是,由于某种原因,它在控制器中最终为 null,我认为它在局部视图中没有任何价值。我会仔细检查最后一个,但是我将它传递给局部视图还是控制器有区别吗?有什么方法可以在将对象传递给视图之前对其进行验证?在那里设置断点似乎不起作用。
    • 您必须解释“将其传递给控制器​​”,因为这没有任何意义,除非您以表单形式发布数据(据我所知,您的 Telerik 组件可能会或可能不会这样做) )。但基本前提是Controller 构建Model,并将其传递给View,以便View 可以专注于呈现该数据。因此,您在问题中呈现的视图应该能够从一开始就执行Model.Visits[x].Dates,因为它应该呈现一个完整的Model。以这种方式完成后,根据经验,我知道在部分视图中获取数据可以按预期工作。
    • 抱歉,我是 MVC 新手,还没有所有的术语。看看这里:tinyurl.com/ya6ug52。这显示了视图,我如何构建模型,以及我如何将它传递给 Telerik 的 LoadContentFrom 方法和控制器方法。这就是我所说的“将模型传递给控制器​​”的意思。当控件加载它的内容,控制器的 SiteVisitDetail 方法被调用,当我在它上面设置断点时,Model.URL 是正确的值,而 Model.Dates 是 null。正如你所看到的,我没有对 Model.Dates 做任何花哨的事情,只需用 DateTime.Now 填充它。
    【解决方案2】:

    查看这篇文章,了解如何传递模型。

    基本上,您可能应该将模型传递给包含您的列表的视图。然后你可以稍后扩展它。

    Multiple models sent to a single view instance

    【讨论】:

    • 我认为这就是我想要做的。问题是,列表对象在到​​达控制器时为空。我在某处看到您无法传递“复杂类型”,并假设 List(或 IEnumerable)就是这样一种类型。不是这样的,我接受吗?我应该能够拥有一个带有列表的模型,并且我应该能够在我的控制器方法中访问该列表?
    • 是的,您应该能够传递复杂类型。我愿意。您可能需要考虑像@Terje 建议的那样将列表分解为 PartilView。这可以帮助您进行调试。部分视图将是强类型的,是的,但我希望这不应该是一个问题。
    • 我将尝试将模型制作为现在的列表,看看这对我有什么帮助。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多