ViewModel, возвращаемый View (PartialView), пуст.

Пожалуйста, помогите мне понять, почему моя модель представления возвращается как пустая. Я пытался найти решение в Google, но подавляющее большинство советов - добавить скрытый. Но у меня добавление Html.HiddenFor не сработало

Вот мой код

Модели просмотра

public class MyViewModel
{
    public FilterViewModel Filter {get; set;}

    public MyViewModel()
    {
        Filter = new FilterViewModel();
    }
}

public class FilterViewModel
{
    public IEnumerable<SelectListItem> TimeUnits { get; set; }
    public string SelectedTimeUnit { get; set; }
}

Контроллер

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MyViewModel model = new MyViewModel();
        model.Filter.TimeUnits = new SelectList( new string[] {"week", "month", "year"});

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        *here I have empty model*
        return View();
    }
}

Просмотреть

@model Mvc4WebApplication.Models.MyViewModel

@using (Html.BeginForm())
{
    @Html.HiddenFor(m => m.Filter.SelectedTimeUnit)
    @Html.Partial("_FilterPartial", Model.Filter)

    <input type="submit" class="ok" value="OK" />
}

Частичный просмотр

@model Mvc4WebApplication.Models.FilterViewModel

<div class="select">
    <div class="background">
        @Html.DropDownListFor(m => m.SelectedTimeUnit, Model.TimeUnits as SelectList, "Select time unit", new { onchange = "FetchPeriods();" })
    </div>
</div>

Спасибо заранее.

UPD Сгенерированный HTML выглядит так

<form action="/" method="post">
   <input id="Filter_SelectedTimeUnit" name="Filter.SelectedTimeUnit" type="hidden" value="">
   <div class="select">
       <div class="background">
           <select id="SelectedTimeUnit" name="SelectedTimeUnit" onchange="FetchPeriods();">
               <option value="">Select time unit</option>
               <option>week</option>
               <option>month</option>
               <option>year</option>
           </select>
       </div>
</div>
    <input type="submit" class="ok" value="OK">
</form>

person Vic    schedule 09.04.2013    source источник
comment
Как выглядит сгенерированный HTML? Кроме того, почему вы используете частичный _FilterPartial вместо EditorTemplate?   -  person Brad Christie    schedule 09.04.2013
comment
Я добавил сгенерированный html к моему вопросу выше. Я привел здесь упрощенный пример. Я использую этот частичный вид в нескольких местах в своей системе.   -  person Vic    schedule 09.04.2013
comment
Почему SelectedTimeUnit упоминается дважды; Один раз как скрытый вход, второй раз в частичном виде? Я также никогда не вижу отображаемого TimeUnits.   -  person Brad Christie    schedule 09.04.2013


Ответы (1)


Не уверен, что вы все еще ищете ответ через 4 года, но я столкнулся с тем же и нашел это решение:

Измените свой

@Html.Partial("_FilterPartial", Model.Filter)

to

@Html.Partial("_FilterPartial", Model.Filter,
       new ViewDataDictionary(Html.ViewData)
       {
            TemplateInfo = new TemplateInfo { HtmlFieldPrefix = Html.NameFor(m => m.Filter).ToString() }
       })

Я нашел ответ здесь

person Carlo    schedule 06.04.2017