我正在使用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)中也为空。
什么会导致这种行为?
答案 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&value2=whatever
因此,当值存在且正确时,由于该放大器而无法正确解析;。
我猜这是Telerik控件的一个问题。我会报告错误,看看他们说了什么。
由于这似乎是问题,我只是将所有内容连接成一个大字符串并在控制器中解析它,直到找到更正式的解决方案。
感谢你的帮助,Martijn。