Domanda

Sto cercando di implementare un controllo Widget che esiste in ogni pagina del sistema, che permetterà all'utente di avere Ricerca di base e funzionalità Directory disponibili in ogni pagina. Questo è un controllo scheda di seguito definito, dove nel <ul> scheda attualmente selezionata è determinata dal valore in Model.CurrentTab e il contenuto corrispondente che voglio visualizzare (in pratica, rendere visibile) è anche determinato da tale valore.

<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>

Il motivo che voglio caricare sia Search e Directory è modo che la pagina non ha bisogno di chiedere il contenuto a seconda di quale scheda viene cliccato. Voglio tutto per essere disponibile immediatamente.

Il problema che sto avendo è che se CurrentTab contiene il valore "Directory" tale mezzo (ho pensato) che Html.RenderAction("SearchBox"... dovrebbe passare in una stringa vuota. Ma quando si arriva al metodo di azione, la vista del modello passato in SearchBox contiene un valore e non ""

Non capisco perché questo sta accadendo. Anche quando mi passa una stringa vuota in SearchBox, vista del modello contiene ancora un valore. Qualcuno può spiegare cosa sta succedendo? Dovrei fare in modo diverso?

Aggiornamento:

    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
    }

Sia DirectoryViewModel e SearchViewModel contengono una proprietà chiamata Search

È stato utile?

Soluzione

Il ModelBinder sarà nuova () qualsiasi oggetto in parametri di un ActionMethod. Non credo che questo comportamento può essere disattivata senza implementare il proprio modelbidner. È necessario creare un sovraccarico che non ha parametri e percorso di conseguenza.

Altri suggerimenti

In caso di fare qualcosa di simile

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

Dal momento che il terzo parametro del Html.RenderAction è object routeValues che è un dizionario con un parametro di azione che si sta chiamando come Key. Se non si specifica il parametro che si sta passando nel parametro di routeValues del vostro Html.RenderAction sarà sempre superare un valore di object al parametro vm della vostra azione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top