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)でもnullになります。

この動作の原因は何ですか?

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); 
    }

これはハック (または少なくともあまりきれいではない) ですが、動作します。

于 2010-01-11T21:05:31.370 に答える
1

構築されているクエリ文字列が正しくないことがわかりました。次のようなものを生成しています:

?value1=somevalue&amp;value2=whatever

そのため、値がそこにあり、正しい一方で、その amp; が原因で適切に解析されていません。

これは Telerik コントロールの問題だと思います。私はバグを報告し、彼らの言うことを見ていきます。

それが問題のように見えるので、より正式な解決策が見つかるまで、すべてを 1 つの大きな文字列に連結し、コントローラーで解析します。

助けてくれてありがとう、マルティン。

于 2010-01-12T04:20:07.643 に答える