2009-04-19 131 views
8

我有一个自定义视图模型定义为:MVC自定义视图模型和自动捆绑

public class SampleFormViewModel 
{ 
    public SampleFormViewModel(SelectList companies, Widget widget) 
    { 
     Companies = companies; 
     Widget = widget; 
    } 

    public SelectList Companies { get; private set; } 
    public Widget Widget { get; private set; } 
} 

在我编辑POST处理程序,我有以下条目:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(SampleFormViewModel model) 
{ 

编辑形式被设置为:

Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>" 

它只是爆炸,不知道发生了什么,有以下错误: 没有p为此对象定义的无参构造函数。 某些我错过了这里真正明显的东西。在一些背景下,GET可以很好地工作,并按照预期显示SelectList的下拉菜单。 我猜自动绑定回自定义视图模型是失败,但不知道该怎么做。

+0

你发布的表单看起来像什么? – 2009-04-19 13:30:22

回答

8

你需要一个无参数的构造函数,我相信这些属性需要有公共setter。默认绑定器使用不带参数的构造函数创建对象,然后使用公共属性上的反射来设置表单/查询参数中的值。

public class SampleFormViewModel 
{ 
    public SampleFormViewModel() { } 

    public SelectList Companies { get; set; } 
    public Widget Widget { get; set; } 
} 

我怀疑,虽然,你真正想要做的是没有得到视图模型,但是底层的Widget模式和形式后选择列表值。我不认为活页夹将能够在后期重建SelectList,因为它只有参数中的选定值。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int CompanyID, Widget widget) 
{ 
} 
+0

是的,我现在明白了。问题是SelectList没有无参数的构造函数。 如果我从构造函数中删除SelectList(公司)。并且当我创建ViewModel时,它可以随时(从widget对象中的信息)建立它,它可以按预期工作。 唯一的区别是我如何在POST中处理它,签名是: public ActionResult编辑(int id,FormCollection formValues) – 2009-04-21 10:01:52

2

对于强类型视图,MVC要求该视图可以创建在该视图上使用的类。这意味着一个没有任何参数的构造函数。这是有道理的。 MVC的新手会看到类似的“嗯?”当他们忘记/未能将参数公开时,以及当视图尝试将自己放在一起时弹出的所有相关错误(而不是编译器错误)时的问题。

但是这类无参数构造函数问题中“有趣”的是当你的类的属性也没有无参数构造函数时。我猜这是悲观的做法?

花了一些学习时间在SelectList类 - 一个特定于MVC的类 - 我希望能帮助一些人节省几分钟/小时。

下拉列表中创建这个非常重要的工具/类,具有以下构造函数:

公众的SelectList(IEnumerable的项目);公共SelectList(IEnumerable items,object selectedValue); public SelectList(IEnumerable items,string dataValueField,string dataTextField); public SelectList(IEnumerable items,string dataValueField,string dataTextField,object selectedValue);

..因此,如果这些属性是你的类(用于视图的属性),MVC会给你一个难以捉摸的“无参数构造函数”错误。

但是,如果你创建了一个类似于辅助类的东西,从你的原始类中剪切-n-paste精确的代码,然后在你的原始类上创建一个参数(不是get/set)你很好走。

以这种方式,您可以使用单个视图获取和发布。哪个更美观:)

个人而言,我会创建编译器来识别强类型视图的关联和需求,或者让下拉列表(或SelectList的其他“客户”)无法正常工作然后想知道是否有无参数构造函数的特定级别的递归检查。

谢天谢地,目前的版本似乎只是顶级的。感觉像一个黑客,我希望它是由设计。

HTH。

+1

您可以详细说明关于选择列表的帮助器类的声明吗? – camainc 2011-09-09 17:55:00