获得“无参数构造函数定义”错误,不确定原因

由于某种原因,我的一个特定的AJAX调用正在获得“无参数构造函数定义”错误。 这是代码:

CallAndReplace(JSON.stringify(model), url, $("#panel")); function CallAndReplace(data, url, replace) { $.ajax({ url: url, type: "post", contentType: "application/json; charset=utf-8", data: data, success: function (result) { replace.html(result); }, error: function (x, e) { if (x.status == 0) { alert('You are offline!!\n Please Check Your Network.'); } else if (x.status == 404) { alert('Requested URL not found.'); } else if (x.status == 500) { alert('Internal Server Error.'); } else if (e == 'parsererror') { alert('Error.\nParsing JSON Request failed.'); } else if (e == 'timeout') { alert('Request Time out.'); } else { alert('Unknow Error.\n' + x.responseText); } } }); } 

‘model’是我MVC-3视图中的一个视图模型,我已经转换为Javascript对象。 ‘url’是通过’@ Url.Action(“Action”,“Controller”)’方法生成的url。 而$(“#panel”)是由控制器动作返回的部分视图替换的div区域。

当我尝试调试项目时,它永远不会进入控制器操作。 当我创建一个没有参数的虚拟控制器动作时,它以调试模式到达那里。 但我显然是在发送数据。 我可以看到Firebug中发布的数据(尽管由于某些原因它没有结构化)但显然它没有被发送过,我不知道为什么。

我在我的代码中使用CallAndReplace 20以用于其他用途,它从来没有给我这个问题。 我完全不知道为什么。

编辑:这是我发送到视图的viewmodel类:

 public class AwardsEdit { public List Awards { get; set; } public int TitleId { get; set; } public List<Tuple> Participants { get; set; } public List AllAwards { get; set; } public List<Tuple> AllAwardCompanies { get; set; } } 

我试图调用的控制器操作:

 public PartialViewResult SaveAwards(AwardsEdit award) { if (ModelState.IsValid) { bool updated = _translator.UpdateAward(award); if (updated) { return PartialView("Details", _translator.GetAwards(award.TitleId)); } //else error ModelState.AddModelError("", "Award data was not saved."); } //on error, load meta data var data = _translator.GetAwards(award.TitleId, true); award.Participants = data.Participants; award.AllAwards = data.AllAwards; award.AllAwardCompanies = data.AllAwardCompanies; return ViewAwards(award.TitleId); } 

控制器本身没有无参数构造函数方法,我使用dependency injection,但我有其他AJAX调用调用该控制器中的各种操作,它们工作正常。 我不知道为什么这个不起作用。

该错误可能是指您的某个操作参数的类型(而不是其他人建议的控制器)。
如果无法首先构造参数,MVC无法填充该参数。

例如,您可以像这样得到相同的错误:

 public class ParameterConstructor { public ParameterConstructor(string parameter){ } } public class MyController : Controller { public ActionResult Test(ParameterConstructor model) { return "This action will not be reached"; } } 

因此,您需要确保您的model类型具有无参数构造函数。

更新

为了响应您更新的代码,您的ViewModel构造函数确实是无参数的。
但是,您有一个Tuple 。 文档说Tuple没有无参数构造函数 。 这就是问题 – 元组被设计为只读。 也许您可以使用KeyValuePair<>代替?

如果要将JSON传递给服务器,则必须将其作为参数的值传递。 只是在AJAX调用上设置“data”属性将不起作用。

你可以使用:

  data: { theJson: data }, 

然后你的服务器会看到一个参数“theJSON”,并可以解码它的值来恢复你的数据结构。

.stringify是它没有结构化的原因。 该调用将获取您的数据,在后面添加[在前面,a],然后创建一个逗号描述的您发送的数据字符串。 也许您的控制器需要一个对象或模型,而是获取一个字符串。

我将validation@Url.Action("Action", "Controller")引用的@Url.Action("Action", "Controller")实际上是否具有无参数构造函数。 或者可能是您不希望存在无参数构造函数,在这种情况下,您必须确保正确配置IoC容器以注入必要的依赖项。

它也可以是ViewModel本身,在这种情况下,您应该确保ViewModel类型上存在无参数(默认)构造函数。

例:

 public class Example { // this is a parameterless constructor public Example() { // ... } } 
 public class MyController : Controller { // make sure constructor has default parameterless constructor public MyController() {} } 

该错误消息并不是最好的 – 它将人们发送到控制器类未被实例化的更可能原因之一。 但它确实应该读作“控制器构造和初始化失败。一个可能的原因是没有无参数构造函数,但你可能已经把它搞砸了。内部exception是……”

抓住它的最佳选择是在调试模式下运行代码,Visual Studio应该在发生exception时将其弹出。

由于您正在使用dependency injection,因此您需要深入研究代码,以找出dependency injection器为何不使用它所需的参数创建控制器实例的原因。