收到“未定义无参数构造函数”错误,不知道为啥
Posted
技术标签:
【中文标题】收到“未定义无参数构造函数”错误,不知道为啥【英文标题】:Getting a "No parameterless constructor defined" error, not sure why收到“未定义无参数构造函数”错误,不知道为什么 【发布时间】:2012-01-19 17:57:54 【问题描述】:由于某种原因,我的一个特定 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 次其他用途,它从来没有给我这个问题。我完全不知道为什么。
编辑:这是我发送到视图的视图模型类:
public class AwardsEdit
public List<AwardsViewModel> Awards get; set;
public int TitleId get; set;
public List<Tuple<int, string>> Participants get; set;
public List<Award1> AllAwards get; set;
public List<Tuple<int, string>> 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);
控制器本身没有无参数的构造方法,我正在使用依赖注入,但我有其他 AJAX 调用可以调用该控制器中的各种操作,并且它们工作正常。我不知道为什么这个不起作用。
【问题讨论】:
你能发布你的控制器代码吗?你在做任何依赖注入吗?当我的控制器没有默认的无参数构造函数时,我会收到此错误。 那个错误是服务器端的,在你进行 Ajax 调用之前检查你的data
是否包含任何东西,听起来对你的控制器的依赖不适用于那个调用
请在您的控制器中发布接受 AJAX 的操作的代码以及它接受的模型的构造函数。我怀疑您正在接受某种类型的模型/视图模型,并且您的模型/视图模型没有采用 0 个参数的构造函数。当 .NET 中的 ModelBinder 尝试将传入的表单转换为您的模型类型时,它要求您的模型有一个接受 0 个参数的构造函数。
刚刚发布了动作和视图模型。
您回答了自己的问题:“控制器本身没有无参数构造函数方法,我正在使用依赖注入”。您需要深入研究依赖注入以找出为什么它不起作用。
【参考方案1】:
错误可能与您的操作的一个参数的类型有关(不是控制器,正如其他人所建议的那样)。 如果不能先构造,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<int, string>
列表。 The documentation says that Tuple does not have a parameterless constructor。这就是问题所在——元组被设计为只读的。也许您可以改用KeyValuePair<>
?
【讨论】:
我的其他视图模型没有无参数构造函数,通过 AJAX 发送它们可以正常工作。 @JaySun 有趣...如果构造函数不是无参数的,那么 MVC 用什么参数调用它?你能在构造函数中设置一个断点,看看你得到了什么值吗?我真的很好奇。 @JaySun 看起来Tuple<>
没有无参数构造函数。这大概就是问题所在。我相应地更新了我的答案。
非常感谢。我有SelectList
,它没有无参数构造函数,所以必须使用IEnumerable<SelectListItem>
【参考方案2】:
如果你想将 JSON 传递给你的服务器,你必须将它作为参数的值传递。仅在 AJAX 调用上设置“数据”属性是行不通的。
你可以使用:
data: theJson: data ,
然后您的服务器会看到一个参数“theJSON”并且可以解码它的值以获取您的数据结构。
【讨论】:
【参考方案3】:.stringify 是它没有结构化的原因。该调用将获取您的数据,在前面添加一个 [,在后面添加一个 ],然后为您发送的数据创建一个逗号分隔的字符串。也许您的控制器需要一个对象或模型,而是得到一个字符串。
【讨论】:
【参考方案4】:我会验证@Url.Action("Action", "Controller")
中引用的控制器实际上有一个无参数的构造函数。或者您可能不希望有一个无参数的构造函数,在这种情况下,您必须确保正确配置您的 IoC 容器以注入必要的依赖项。
也可能是 ViewModel 本身,在这种情况下,您应该确保 ViewModel 类型上存在无参数(默认)构造函数。
示例:
public class Example
// this is a parameterless constructor
public Example()
// ...
【讨论】:
【参考方案5】:public class MyController : Controller
// make sure constructor has default parameterless constructor
public MyController()
【讨论】:
【参考方案6】:该错误消息并不是最严重的——它会将人们发送到控制器类未实例化的更可能原因之一。但它确实应该读作“控制器构造和初始化失败。一个可能的原因是没有无参数构造函数,但你可能以其他方式搞砸了。内部异常是......”
最好的办法是在调试模式下运行你的代码,当它发生时,Visual Studio 应该让你跳到异常。
【讨论】:
我确实在调试模式下运行了我的代码。没啥事儿。错误刚刚出现在我的浏览器中。 有趣。您是否查看了调试窗口,有时这会让您知道。直接请求 AJAX url 也会有所帮助,检查结果也会有所帮助——它可能有你需要得到的内部异常。【参考方案7】:由于您使用的是依赖注入,因此您需要深入研究您的代码,以找出依赖注入器未创建具有所需参数的控制器实例的原因。
【讨论】:
以上是关于收到“未定义无参数构造函数”错误,不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章
我收到 tkinter 'bad window path name .!button2' 的错误,我不知道为啥?
为啥我收到此错误“没有构造函数实例”,CUDA 优化器中的 viennacl 库,C++ 控制台应用程序
我不知道为啥我在发送不和谐的 webhook 时收到 400 bad request 错误。一切似乎都很好,但我对此很陌生