0

我正在使用Telerik PanelBar 使用局部视图进行一些异步加载。我正在为父视图中的局部视图创建一个模型,但由于某种原因,我的数据没有完整地通过。

// Parent view
<% 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; // this is properly set
        model.Dates = new List<DateTime>(); // this is null in the controller
        model.Dates.Add(DateTime.Now);

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

    }
}).Render();



  // Report controller method
    public ActionResult SiteViewDetail(SiteVisitDetailModel model)
    {
        return PartialView(model); // model.URL is correct, model.Dates is null
    }

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

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

正如我的评论所建议的,当调用控制器的 SiteVisitDetail 方法时,Model.URL 具有正确的数据,并且 Model.Dates 为 null(它不是包含 null 的列表,它本身为 null)。正如预期的那样,它在局部视图 (SiteViewDetail) 中也为空。

什么会导致这种行为?

4

2 回答 2

1

我自己还没有使用 Telerik MVC 控件,但是查看LoadContentFrom 的 API似乎这个方法(及其所有重载)将在某个 URL 处执行 GET 请求。使对象传递参数的重载可能不知道如何序列化列表(检查 HTTP 流量将提供更多详细信息)。

您唯一的选择是使用该LoadContentFrom(String)方法并将格式化的日期列表传递为string

var dateArray = model.Dates.Select(d => d.ToString()).ToArray();
var serializedDateString = String.Join("#", dateArray);
items.Add()
        .Text(item.Key.ToString() + " " + item.Count().ToString() + " visits")
        .LoadContentFrom(Url.Action("SiteViewDetail","Report" new { dates = serializedDateString, url = model.URL}))

然后你的控制器应该看起来像这样:

public ActionResult SiteViewDetail(string dates, string url)
    {
        SiteVisitDetailModel model = new SiteVisitDetailModel();
        //split dates back into a List<DateTime>
        model.Dates = dates.Split('#').Select(s => DateTime.Parse(s)).ToList<DateTime>();
        model.URL = url;
        return PartialView(model); 
    }

这是一个 hack(或者至少不是很漂亮),但它会起作用。

于 2010-01-11T21:05:31.370 回答
1

事实证明,正在构建的查询字符串不正确。它正在产生类似的东西:

?value1=somevalue&amp;value2=whatever

因此,尽管该值存在且正确,但由于该 amp; 无法正确解析它。

我猜这是 Telerik 控件的问题。我会报告这个错误,看看他们怎么说。

由于这似乎是问题所在,我只是将所有内容连接成一个大字符串并在控制器中解析它,直到找到更正式的解决方案。

谢谢你的帮助,马丁。

于 2010-01-12T04:20:07.643 回答