MVC:在局部视图中模拟缺失数据

时间:2010-01-11 20:01:37

标签: asp.net-mvc model partial-views

我正在使用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)中也为空。

什么会导致这种行为?

2 个答案:

答案 0 :(得分:1)

我自己还没有使用过Telerik MVC控件,但是查看API for LoadContentFrom看来这个方法(以及它的所有重载)都会在某个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); 
    }

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

答案 1 :(得分:0)

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

?value1=somevalue&amp;value2=whatever

因此,当值存在且正确时,由于该放大器而无法正确解析;。

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

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

感谢你的帮助,Martijn。