MVC: модель отсутствующих данных в частичном представлении - PullRequest
0 голосов
/ 11 января 2010

Я использую 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 ]

1 голос
/ 12 января 2010

Я сам еще не использовал элементы управления Telerik MVC, но, глядя на API для LoadContentFrom , кажется, что этот метод (и вся его перегрузка) выполнит запрос GET по определенному URL. Перегрузка, которая приводит к тому, что объект передает параметры с большей вероятностью, не знает, как сериализировать списки (проверка 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); 
    }

Это взломать (или, по крайней мере, не очень красиво), но это будет работать.

0 голосов
/ 12 января 2010

Оказывается, строящаяся строка запроса неверна. Он генерирует что-то вроде:

?value1=somevalue&amp;value2=whatever

Так что, пока значение там и правильно, оно не анализируется должным образом из-за этого усилителя;

Полагаю, это проблема с управлением Telerik. Я сообщу об ошибке и посмотрю, что они говорят.

Поскольку это, похоже, проблема, я собираюсь объединить все в одну большую строку и проанализировать ее в контроллере, пока не будет найдено более формальное решение.

Спасибо за вашу помощь, Мартейн.

...