Javascript 得到一个;“未定义无参数构造函数”;错误,不知道为什么
出于某种原因,我的一个特定AJAX调用得到了一个“无参数构造函数定义”错误。代码如下:Javascript 得到一个;“未定义无参数构造函数”;错误,不知道为什么,javascript,jquery,asp.net,ajax,asp.net-mvc-3,Javascript,Jquery,Asp.net,Ajax,Asp.net Mvc 3,出于某种原因,我的一个特定AJAX调用得到了一个“无参数构造函数定义”错误。代码如下: CallAndReplace(JSON.stringify(model), url, $("#panel")); function CallAndReplace(data, url, replace) { $.ajax({ url: url, type: "post", contentType: "application/json; charset=u
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视图中的一个viewmodel,我已将其转换为Javascript对象url'是通过'@url.Action(“Action”,“Controller”)'方法生成的url。$(“#panel”)是由控制器操作返回的部分视图替换的div区域
当我尝试调试项目时,它永远不会进入控制器操作。当我创建一个没有参数的虚拟控制器操作时,它在调试模式下到达那里。但我显然是在发送数据。我可以看到数据被发布在Firebug中(尽管出于某种原因它没有结构化),但显然它没有被发送过来,我不知道为什么
我在代码中使用CallAndReplace 20次用于其他用途,但它从未给我这个问题。我完全不知道为什么
编辑:下面是我要发送到视图的viewmodel类:
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; }
}
控制器本身没有无参数构造函数方法,我正在使用依赖项注入,但我有其他AJAX调用,它们调用该控制器中的各种操作,并且工作正常。我不知道为什么这个不起作用。如果要将JSON传递给服务器,必须将其作为参数值传递。仅仅在AJAX调用上设置“data”属性是行不通的 您可以使用:
data: { theJson: data },
然后,您的服务器将看到一个参数“theJSON”,并可以解码该参数的值以恢复您的数据结构。。stringify是它没有结构化的原因。该调用将获取您的数据,在前面添加一个[a],在后面添加一个[a],然后创建一个逗号分隔的字符串来表示您发送的数据。也许您的控制器需要一个对象或模型,而不是一个字符串 我将验证您的
@Url.Action(“Action”、“Controller”)
中引用的控制器是否实际具有无参数构造函数。或者,您可能不希望存在无参数构造函数,在这种情况下,您必须确保您的IoC容器已正确配置为注入必要的依赖项
它也可以是ViewModel本身,在这种情况下,您应该确保ViewModel类型上存在无参数(默认)构造函数
示例:
public class Example
{
// this is a parameterless constructor
public Example()
{
// ...
}
}
该错误消息并不是最严重的——它将人们发送到控制器类未被实例化的更可能的原因之一。但它真的应该是“控制器构造和初始化失败。一个可能的原因是没有无参数构造函数,但您可能以其他方式搞砸了。内部异常是…”
捕获该异常的最佳方法是在调试模式下运行代码,Visual Studio应在异常发生时将您弹出到异常中。错误可能是指操作的一个参数的类型(而不是其他人建议的控制器)。
如果不能首先构造参数,MVC将无法填充该参数 例如,您可以得到如下相同的错误:
public class ParameterConstructor
{
public ParameterConstructor(string parameter){
}
}
public class MyController : Controller {
public ActionResult Test(ParameterConstructor model) {
return "This action will not be reached";
}
}
因此,您需要确保您的模型
类型具有无参数构造函数
更新
作为对更新代码的响应,您的ViewModel构造函数确实是无参数的。但是,您有一个
元组的列表。这就是问题所在——元组被设计成只读的。也许您可以使用KeyValuePair
来代替?因为您使用依赖项注入,所以您需要深入到您的代码中,以找出依赖项注入程序为什么没有创建具有所需参数的控制器实例。您可以发布控制器代码吗?你在做依赖注入吗?当我的控制器没有默认的无参数构造函数时,我会出现此错误。此错误是服务器端的错误,在进行Ajax调用之前,请检查数据是否包含任何内容,听起来对控制器的依赖不适用于该调用。请在接受AJAX的控制器中发布该操作的代码,以及它接受的模型的构造函数。我怀疑您正在接受某种类型的模型/视图模型,并且您的模型/视图模型没有接受0个参数的构造函数。当.NET中的ModelBinder尝试将传入表单转换为您的模型类型时,它要求您的模型有一个接受0个参数的构造函数。刚刚发布了操作和视图模型。您回答了自己的问题:“控制器本身没有无参数构造函数方法,我正在使用依赖项注入”。你需要深入研究依赖项注入,找出它不起作用的原因。我确实在调试模式下运行了我的代码。什么也没发生。错误刚刚出现在我的浏览器中。很有趣。您是否查看了调试窗口,有时会让您知道。直接请求AJAX url也会有帮助,检查结果也会有帮助——它可能有内部异常,这正是您需要了解的。我的其他视图模型没有无参数构造函数,通过AJAX发送它们很好。@JaySun有趣。。。如果构造函数不是无参数的,那么MVC用什么参数调用它?你能在构造函数中设置一个断点,看看你得到了什么值吗?我真的很好奇。@JaySun看起来Tuple
没有无参数构造函数。这可能就是问题所在。我相应地更新了我的答案。非常感谢。我有SelectList
,它没有无参数构造函数,所以必须使用IEnumerable
public class MyController : Controller
{
// make sure constructor has default parameterless constructor
public MyController() {}
}
public class ParameterConstructor
{
public ParameterConstructor(string parameter){
}
}
public class MyController : Controller {
public ActionResult Test(ParameterConstructor model) {
return "This action will not be reached";
}
}