2010-01-11 8 views
0

J'utilise le PanelBar Telerik pour effectuer un chargement asynchrone en utilisant une vue partielle. Je crée un modèle pour la vue partielle dans une vue parente, mais pour une raison quelconque, mes données ne sont pas prises en compte.MVC: Modèle de données manquantes en vue partielle

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

Comme suggéré par mes commentaires, lorsque la méthode SiteVisitDetail est appelée, a Model.URL les données correctes et Model.Dates est nul (ce n'est pas une liste contenant nulle, elle-même est nulle) du contrôleur. Comme on pouvait s'y attendre, il est également nul dans la vue partielle (SiteViewDetail).

Qu'est-ce qui causerait ce problème?

+0

Vous ne devriez vraiment pas utiliser les contrôles ASP.NET dans une application ASP.NET MVC - Les contrôles violent la séparation des préoccupations et ne sont pas la façon de faire 'MVC'. –

+0

C'est dans leur suite MVC, et mis à part ce problème, je l'ai trouvé très facile à utiliser. Je ne pense pas que je fasse quelque chose dans un type de WebForms, n'est-ce pas? –

+0

Dans votre question, vous n'avez pas mentionné que vous utilisiez leurs contrôles MVC, vous venez de mentionner que vous utilisiez la barre de menu Telerik (qui existe dans leurs contrôles ASP.NET AJAX). –

Répondre

0

Il s'avère que la chaîne de requête en cours de construction n'est pas correcte. Il est de générer quelque chose comme:

?value1=somevalue&amp;value2=whatever 

Ainsi, alors que la valeur est là et correcte, il ne se correctement analysé à cause de cette ampli ;.

Je suppose qu'il s'agit d'un problème avec le contrôle Telerik. Je signalerai le bug et verrai ce qu'ils disent. Puisque cela semble être le problème, je vais juste concaténer tout en une grande chaîne et l'analyser dans le contrôleur, jusqu'à ce qu'une solution plus formelle puisse être trouvée.

Merci pour votre aide, Martijn.

+0

Telerik a répondu, a confirmé qu'il y a un bug, et a dit qu'il sera corrigé dans la prochaine version. –

1

Je n'ai pas encore utilisé les contrôles Telerik MVC mais en regardant le API for LoadContentFrom il semble que cette méthode (et toute sa surcharge) fera une requête GET à une certaine URL. La surcharge qui prend un objet pour transmettre des paramètres plus que probable ne sait pas comment sérialiser les listes (l'inspection du trafic HTTP donnera plus de détails).

Votre seule option est d'utiliser la méthode LoadContentFrom(String) et transmettre une liste formatée des dates 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})) 

Ensuite, votre contrôleur devrait ressembler à ceci:

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

Il est un hack (ou du moins pas très joli) mais ça va marcher.

+0

Vous savez ce qui est vraiment bizarre? Je l'avais déjà essayé plus tôt et j'avais le même problème. la chaîne de date s'est avérée nulle aussi. Je l'ai essayé tout à l'heure (je viens de mettre la chaîne à "biscuits", mon mot de test préféré), et encore, c'est nul, alors que l'URL est correctement définie. Et je me suis souvenu de changer le type de propriété dans le modèle. Donc, le fait que cela se produise avec un type de chaîne simple, et que d'autres ont suggéré que vous pouvez passer une liste de cette façon, me fait penser que quelque chose d'autre ne va pas ici. –

+0

'Url.Action' ne peut pas sérialiser les' List ' pour obtenir des chaînes GET soit je ne suis pas surpris Telerik ne le supporte pas non plus. Vous pouvez POST 'List ' très bien cependant. Pouvez-vous mettre à jour votre question avec le code mis à jour en utilisant ce travail?Peut-être qu'un autre ensemble d'yeux pourrait repérer où ça va mal :) –

+0

L'URL est une chaîne, et cela semble fonctionner. Sérieusement, tout ce que j'ai fait était de changer le modèle de la liste publique Dates en public String Dates, et la vue de model.Dates = new Liste () (et supprimer la ligne ci-dessous) à model.Dates = "biscuits" . Dans la méthode du contrôleur, model.URL (une chaîne) est la bonne valeur, et model.Dates (maintenant aussi une chaîne) est null. –