Почему эта модель представления заполняется, когда я передаю "" в RenderAction?
Я пытаюсь реализовать элемент управления Widget, который существует на каждой странице в системе, который позволит пользователю иметь базовые функции поиска и каталога на каждой странице. Это вкладка управления, определенная ниже, где в <ul>
текущая выбранная вкладка определяется значением в Model.CurrentTab
и соответствующий контент, который я хочу отобразить (в основном, сделать видимым), также определяется этим значением.
<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>
Причина, по которой я хочу загрузить оба Search
а также Directory
Это значит, что странице не нужно запрашивать содержимое в зависимости от того, на какой вкладке нажата кнопка. Я хочу, чтобы все это было доступно немедленно.
У меня проблема в том, что если CurrentTab
содержит значение "Directory", это означает (я предположил), что Html.RenderAction("SearchBox"...
должен перейти в пустую строку. Но когда дело доходит до метода действия, модель представления передается в SearchBox
содержит значение, а не ""
Я не понимаю, почему это происходит. Даже когда я передаю пустую строку в SearchBox
модель представления все еще содержит значение. Может кто-нибудь объяснить, пожалуйста, что происходит? Должен ли я делать это по-другому?
Обновить:
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
}
И то и другое DirectoryViewModel
а также SearchViewModel
содержать свойство под названием Search
2 ответа
ModelBinder будет новый () вверх любой объект в параметрах ActionMethod. Я не думаю, что это поведение может быть отключено без реализации вашего собственного моделя. Вам необходимо создать перегрузку без параметров и соответствующим образом направить ее.
Если вы делаете что-то вроде этого
<% Html.RenderAction("SearchBox", "Search",
new { vm = ((Model.CurrentTab == "Search") ? Model.Search : "") }); %>
Поскольку третий параметр Html.RenderAction
является object routeValues
это словарь с параметром действия, которое вы вызываете как Key
, Если вы не укажете параметр, который вы передаете в свой routeValues
параметр вашего Html.RenderAction
это всегда пройдет object
значение для vm
параметр вашего действия.