Почему эта модель представления заполняется, когда я передаю "" в 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 параметр вашего действия.

Другие вопросы по тегам