由于某种原因,我的一个特定的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调用调用该控制器中的各种操作,它们工作正常。我不知道为什么这个不起作用。
答案 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)
由于你正在使用依赖注入,你需要深入研究代码,找出依赖注入器为什么没有用它所需的参数创建控制器实例的原因。