收到“未定义无参数构造函数”错误,不知道为啥

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&lt;int, string&gt; 列表。 The documentation says that Tuple does not have a parameterless constructor。这就是问题所在——元组被设计为只读的。也许您可以改用KeyValuePair&lt;&gt;

【讨论】:

我的其他视图模型没有无参数构造函数,通过 AJAX 发送它们可以正常工作。 @JaySun 有趣...如果构造函数不是无参数的,那么 MVC 用什么参数调用它?你能在构造函数中设置一个断点,看看你得到了什么值吗?我真的很好奇。 @JaySun 看起来Tuple&lt;&gt; 没有无参数构造函数。这大概就是问题所在。我相应地更新了我的答案。 非常感谢。我有SelectList,它没有无参数构造函数,所以必须使用IEnumerable&lt;SelectListItem&gt;【参考方案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】:

由于您使用的是依赖注入,因此您需要深入研究您的代码,以找出依赖注入器未创建具有所需参数的控制器实例的原因。

【讨论】:

以上是关于收到“未定义无参数构造函数”错误,不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章

我不知道为啥我会收到分段错误错误

我收到“字符串下标超出范围错误”。我不知道为啥

我在 csound 中收到一条错误消息,但我不知道为啥

我收到 tkinter 'bad window path name .!button2' 的错误,我不知道为啥?

为啥我收到此错误“没有构造函数实例”,CUDA 优化器中的 viennacl 库,C++ 控制台应用程序

我不知道为啥我在发送不和谐的 webhook 时收到 400 bad request 错误。一切似乎都很好,但我对此很陌生