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

时间:2011-12-13 21:24:57

标签: 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=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”)'方法生成的网址。 $(“#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; }
}

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

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调用调用该控制器中的各种操作,它们工作正常。我不知道为什么这个不起作用。

7 个答案:

答案 0 :(得分:11)

错误可能是指您的某个操作参数的类型(而不是其他人建议的控制器)。
如果无法首先构造参数,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<>代替?

答案 1 :(得分:0)

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

您可以使用:

    data: { theJson: data },

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

示例:

public class Example
{
    // this is a parameterless constructor
    public Example()
    {
        // ...
    }
}

答案 4 :(得分:0)

public class MyController : Controller
{
    // make sure constructor has default parameterless constructor
    public MyController() {}
}

答案 5 :(得分:0)

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

最好的办法就是在调试模式下运行代码,Visual Studio应该在发生异常时将其弹出。

答案 6 :(得分:0)

由于你正在使用依赖注入,你需要深入研究代码,找出依赖注入器为什么没有用它所需的参数创建控制器实例的原因。