2010-09-02 25 views
0

J'essaye d'implémenter un contrôle de Widget qui existe sur chaque page dans le système, qui permettra à l'utilisateur d'avoir la fonctionnalité de base de recherche & d'annuaire disponible sur chaque page. C'est un contrôle onglet défini ci-dessous, où dans le <ul> l'onglet actuellement sélectionné est déterminé par la valeur dans Model.CurrentTab et le contenu correspondant que je veux afficher (fondamentalement, rendre visible) est également déterminé par cette valeur.Pourquoi ce modèle de vue est-il rempli lorsque je passe "" dans RenderAction?

<div class="WidgetControl"> 

    <ul class="WidgetTab tabs"> 
     <li <%= (Model.CurrentTab == "Search") ? "class='active'" : "" %>> 
      <span href='<%= Url.Action("SearchBox", "Search") %>'>Search</span> 
     </li> 

     <li <%= (Model.CurrentTab == "Directory") ? "class='active'" : "" %>> 
      <span href='<%= Url.Action("DirectoryList", "Group") %>'>Directory</span> 
     </li> 
    </ul> 

    <div id="Search" class="tab_container"> 
     <% Html.RenderAction("SearchBox", "Search" 
        , (Model.CurrentTab == "Search") ? Model.Search : ""); %> 
    </div> 

    <div id="Directory" class="tab_container"> 
     <% Html.RenderAction("DirectoryList", "Group" 
        , (Model.CurrentTab == "Directory") ? Model.Search : ""); %> 
    </div> 
</div> 

La raison pour laquelle je veux charger les deux Search et Directory est si la page ne doit pas demander le contenu en fonction de l'onglet est cliqué. Je veux que tout soit disponible immédiatement.

Le problème que j'ai est que si CurrentTab contient la valeur "Directory" cela signifie (j'ai supposé) que Html.RenderAction("SearchBox"... devrait passer dans une chaîne vide. Mais quand il arrive à la méthode d'action, le modèle de vue passé en SearchBox contient une valeur et non ""

Je ne comprends pas pourquoi cela se produit. Même lorsque je passe une chaîne vide dans SearchBox, le modèle de vue contient toujours une valeur. Quelqu'un peut-il expliquer ce qui se passe? Devrais-je faire cela différemment?

mise à jour:

public PartialViewResult DirectoryList(DirectoryViewModel vm) 
    { 
     return PartialView(vm.Search); // this is expecting a string 
    } 

    public PartialViewResult SearchBox(SearchViewModel vm) 
    { 
     return PartialView(vm); // the among other things, the Search string is used 
    } 

Les deux DirectoryViewModel et SearchViewModel contiennent une propriété appelée Search

+0

pouvez-vous nous montrer les définitions de méthodes pour DirectoryList et SearchBox? J'ai du mal à comprendre ce qui se passe. –

+0

Le partage de la valeur incorrecte du modèle serait utile. – jfar

+0

@Alistair, j'ai mis à jour la question – DaveDev

Répondre

1

Le ModelBinder ajoutera() un objet dans les paramètres d'un objet ActionMethod. Je ne pense pas que ce comportement peut être désactivé sans implémenter votre propre modelbidner. Vous devez créer une surcharge sans paramètre et l'acheminer en conséquence.

0

devriez-vous faire quelque chose comme ça

<% Html.RenderAction("SearchBox", "Search", 
        new { vm = ((Model.CurrentTab == "Search") ? Model.Search : "") }); %> 

Depuis le troisième paramètre du Html.RenderAction est object routeValues qui est une dictio naire avec un paramètre de l'action que vous appelez Key. Si vous ne spécifiez pas le paramètre que vous transmettez dans votre paramètre routeValues de votre Html.RenderAction, il transmettra toujours une valeur object au paramètre vm de votre Action.