Javascript 得到一个;“未定义无参数构造函数”;错误,不知道为什么

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

出于某种原因,我的一个特定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视图中的一个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";
    }
}