Warum ist bevölkert diese Ansicht Modell ist, wenn ich „“ in Render passieren?
-
26-09-2019 - |
Frage
Ich versuche, eine Widget Kontrolle zu implementieren, die auf jeder Seite im System vorhanden ist, die der Benutzer auf jeder Seite zur Verfügung Grunde Search & Directory-Funktionalität haben kann. Dies ist eine Registersteuer unten definiert, wo in der <ul>
der aktuell ausgewählte Registerkarte durch den Wert in Model.CurrentTab
bestimmt wird und dass der entsprechende Inhalt I (im Allgemeinen, sichtbar zu machen) angezeigt werden soll wird auch von diesem Wert bestimmt.
<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>
Der Grund, warum ich sowohl Search
und Directory
laden möchten ist, so dass die Seite nicht den Inhalt muss anfordern je nachdem, welche Registerkarte geklickt wird. Ich will alles sofort zur Verfügung steht.
Das Problem, das ich habe, ist, dass, wenn CurrentTab
den Wert „Directory“ enthält dieses Mittel (I angenommen), dass Html.RenderAction("SearchBox"...
in einem leeren String übergeben sollte. Aber wenn es um die Aktion-Methode wird, enthält die Ansicht Modell ging in SearchBox
Wert und nicht ""
Ich verstehe nicht, warum dies geschieht. Selbst wenn ich eine leere Zeichenfolge in SearchBox
passieren, enthält die Ansicht Modell noch einen Wert. Kann jemand bitte erklären, was los ist? Soll ich das anders?
Update:
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
}
Sowohl DirectoryViewModel
und SearchViewModel
enthalten eine Eigenschaft namens Search
Lösung
Die Modelbinder wird neu () auf ein beliebiges Objekt in Parameter einer ActionMethod. Ich glaube nicht, das Verhalten Ihrer eigenen modelbidner ohne Umsetzung ausgeschaltet werden kann. Sie müssen eine Überlastung schaffen, das es keine Parameter und Route entsprechend hat.
Andere Tipps
Wenn Sie so etwas wie diese
tun <% Html.RenderAction("SearchBox", "Search",
new { vm = ((Model.CurrentTab == "Search") ? Model.Search : "") }); %>
Da der dritte Parameter der Html.RenderAction
object routeValues
ist das ein Wörterbuch mit einem Parameter der Aktion ist, die Sie als Key
anrufen. Wenn Sie die Parameter nicht angeben, dass Sie in Ihrem routeValues
Parameter Ihrer Html.RenderAction
sind vorbei wird es immer einen object
Wert auf den vm
Parameter Ihrer Aktion übergeben.