mvc2“没有为此对象定义的无参数构造函数”错误

时间:2012-02-27 05:55:01

标签: c# asp.net-mvc parameters formcollection

我知道在很多场合之前都会被问过,但是当我遇到这种情况时我有点困惑....

我有一个这样的视图模型:

public class RAssessment
    {
        [HiddenInput]
        public string rid { get; set; }

        [HiddenInput]
        public string NextPageAction { get; set; }

        [HiddenInput]
        public string PrevPageAction { get; set; }

        [HiddenInput]
        public string CodeType { get; set; }

        public MultiSelectList CA { get; set; }

        public MultiSelectList NonCA { get; set; }

        public List<SelectListItem> AXM { get; set; }

        public List<SelectListItem> IntOrders { get; set; }

        public List<SelectListItem> IntLang { get; set; }

        public List<SelectListItem> IntLang2 { get; set; }


        //Get RAssessment details
        public RAssessment(int id)
        {
            //get details
        }


        public RAssessment()
        {

        }

}

和一个简单的get和post控制器动作如下:

[HttpGet]
        public ActionResult RAssessment(int id)
        {
            RAssessment ra = new RAssessment(id);            
            return View("RAssessment", ra);            
        }

        [HttpPost]
        public ActionResult RAssessment(RAsessment ra, FormCollection formdata)
        {            
            if (ModelState.IsValid)  
            {
                :
                return RedirectToAction(blah);
            }
            return View();
        }

在我的页面视图中..它有页面声明:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/MasterPage/Template.Master" Inherits="System.Web.Mvc.ViewPage<xxxx.Models.RAssessment>" %>

当视图上的提交发生时,它会调用actionresult RAssessment但由于某种原因它给了我臭名昭着的“没有为此对象定义的无参数构造函数”。 (我知道通过BOTH模型和formcollection听起来很奇怪,但在这种情况下我需要这样做)。这种情况的正常答案是“因为你没有在你的模型中为RAssessment创建一个构造函数”,但正如你在模型中看到的那样我已经完成了它,当我在空模型构造函数中放置细分时,actionresult会去那里。如果我删除了actionresult中的RAssessment参数,它确实有效,但我确实希望在actionresult中传递模型数据,然后执行一些复杂的模型验证。谁能告诉我正确的方向?谢谢。 WML

1 个答案:

答案 0 :(得分:2)

我认为如果MultiSelectList具有无参数构造函数,或者您希望在视图模型上方添加[Bind(Exclude="NonCA, CA")],则可以消除错误。然后,当标记为[HttpPost]的操作中发生绑定时,您将获得这些属性为null。

所有这一切的原因是,当你HttpPost时,它会尝试重新创建RAssessment ra及其中的所有属性/字段,其值包含隐藏字段,文本字段等。不幸的是,目前它是无法重新创建NonCA和/或CA.

如果您查看MSDN,则可以看到MultiSelectList没有无参数构造函数。