Asp.net mvc ASP.MVC 1.0操作时未填充复杂视图模型

Asp.net mvc ASP.MVC 1.0操作时未填充复杂视图模型,asp.net-mvc,viewmodel,modelbinder,Asp.net Mvc,Viewmodel,Modelbinder,我为一个新项目学习MVC已经三天了,我在遇到的许多问题上都遇到了困难——主要是一些简单的问题,比如以类型安全(且可管理)的方式将数据移动到视图并返回控制器。这是最新的 我以前看过这方面的报道,但似乎没有任何建议起作用。我有一个复杂的视图模型: public class IndexViewModel : ApplicationViewModel { public SearchFragment Search { get; private set; } public IndexViewModel

我为一个新项目学习MVC已经三天了,我在遇到的许多问题上都遇到了困难——主要是一些简单的问题,比如以类型安全(且可管理)的方式将数据移动到视图并返回控制器。这是最新的

我以前看过这方面的报道,但似乎没有任何建议起作用。我有一个复杂的视图模型:

public class IndexViewModel : ApplicationViewModel
{
 public SearchFragment Search { get; private set; }

 public IndexViewModel()
 {
  this.Search = new SearchFragment();
 }
}
public class SearchFragment
{
 public string ItemId { get; set; }
 public string Identifier { get; set; }
}
此映射到(主索引页):

我的问题是,当视图模型从视图重新水化到视图模型时,SearchFragment元素为null。我怀疑这是因为默认的模型绑定器没有实现在视图映射到SearchFragment类中内联呈现的HTML ItemId和标识符元素。当IndexViewModel中有两个额外属性(ItemId和Identifier)时,这些值被正确绑定

不幸的是,据我所知,我必须使用SearchFragment,因为我需要它来强类型搜索用户控件。。。由于控件可以在任何地方使用,因此它可以在任何父视图下操作

我真的不想让它使用“魔术弦”。这件事已经发生得太多了

我曾尝试在HTML前面加上“Search.”前缀,希望模型绑定器能够识别“Search.ItemId”并匹配IndexViewModel“Search”属性和其中的ItemId,但这不起作用

我担心我将不得不写我自己的ModelBinder来做这件事,但这肯定是你可以开箱即用的东西

如果做不到这一点,是否还有其他建议(或与已经做过这项工作的人的链接?)

希望



谢谢你。很明显,MVC中缺少这一基本要求:p我想你的问题可能在这里:

public IndexViewModel()
{
  this.Search = new SearchFragment();
}
您是否尝试将搜索属性保留为空?我知道DefaultModelBinder中受CreateModel保护的方法不会启动,除非该值已经为null,但我不确定是否要设置属性。如果你还没试过的话,试试看

编辑:

我刚刚注意到:

<%= Html.TextBox("identifier", Model.Identifier)%

也许您应该尝试将您的操作方法更改为以下内容,并手动执行绑定:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Search(FormCollection formCollection)
{
   var viewModel = new IndexViewModel();
   viewModel.Search.ItemId = formCollection[0];
   viewModel.Search.Identifier = formCollection[1];
   ...
}

但是这种方法有点类似于创建自己的活页夹

我的第一个想法是SearchFragment的属性与表单字段的大小写不同

我可能错了,但可能值得检查一下

编辑


在进一步的反例中,您可能还想考虑表单使用SaleC碎片的事实,但是视图使用了索引视图模型——为什么不只是使用SeaScript片段作为View模型?

对不起,都不起作用。如果我将SearchFragment保留为null,则会得到一个“传递到字典的模型项的类型为'GUI.Web.Models.Search.IndexViewModel',但此字典需要'GUI.Web.Models.Fragments.SearchFragment'类型的模型项。2异常。”。如果我像你说的那样更改Html.Textbox,它仍然不起作用。如果是这样做的话,你能提供一个完整的工作示例吗?我没有注意到它是一个用户控件。我被难住了,我希望你的例子能奏效……我想你会在这篇文章中找到一个有趣的解决方案,谢谢。我会尽快仔细看看
public IndexViewModel()
{
  this.Search = new SearchFragment();
}
<%= Html.TextBox("identifier", Model.Identifier)%
<%= Html.TextBox("Search.Identifier", Model.Identifier)%
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Search(FormCollection formCollection)
{
   var viewModel = new IndexViewModel();
   viewModel.Search.ItemId = formCollection[0];
   viewModel.Search.Identifier = formCollection[1];
   ...
}