1

请帮我理解为什么我的视图模型被视图返回为空。我试图在谷歌找到解决方案,但绝大多数的建议是添加隐藏。但对我来说将Html.HiddenFor没有工作

这里是我的代码由View(PartialView)返回的ViewModel为空

的ViewModels

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" /> 
} 

PartialView

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

Thanx提前。

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

什么是生成的HTML是什么样子?另外,为什么你在'EditorTemplate'上使用部分'_FilterPartial'? – 2013-04-09 12:54:27

+0

我在上面的问题中添加了生成的html。我已经把这个简单的例子。我在我的系统的几个地方使用这个局部视图 – Vic 2013-04-09 13:03:09

+0

为什么'SelectedTimeUnit'被引用两次;一次作为隐藏的输入,第二次在局部视图中?我也看不到'TimeUnits'。 – 2013-04-09 13:10:33

回答

0

不知道,如果你还在寻找4年后的答案,但我只是碰到了同样的事情,发现这个解决方案:

更改

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

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

我找到了答案here