我在Controller内部有一个Action函数,该函数被AJAX调用。该操作采用1个参数。在客户端,我构造了一个JSON对象,该对象应序列化为该1参数。我遇到的问题是参数类被声明为抽象。因此,它不能被实例化。
当AJAX击中该动作时,我得到以下信息:
无法创建抽象类。
堆栈跟踪:
[MissingMethodException:无法创建抽象类。]
System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔publicOnly,布尔noCheck,布尔&canBeCached,RuntimeMethodHandleInternal&ctor,布尔&bNeedSecurityCheck)+0
System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔skipCheckThis,布尔)+98System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly,布尔skipVisibilityChecks,布尔skipCheckThis,布尔fillCache)+241
System.Activator.CreateInstance(类型,布尔非公共)+69 ............. ..
有什么方法可以在不创建其他参数对象,“取消声明”参数对象为抽象或挖掘MVC机制的情况下实现这种情况?
我目前正在与后端开发人员一起调整对象。无论哪种方式,我认为这都是最终的解决方案。谢谢大家的答案。
更新: 示例现在使用AJAX JSON POST
如果必须使用抽象类型,则可以提供自定义模型绑定程序来创建具体实例。一个例子如下所示:
模型/模型粘合剂
public abstract class Student
{
public abstract int Age { get; set; }
public abstract string Name { get; set; }
}
public class GoodStudent : Student
{
public override int Age { get; set; }
public override string Name { get; set; }
}
public class BadStudent : Student
{
public override int Age { get; set; }
public override string Name { get; set; }
}
public class StudentBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var values = (ValueProviderCollection) bindingContext.ValueProvider;
var age = (int) values.GetValue("Age").ConvertTo(typeof (int));
var name = (string) values.GetValue("Name").ConvertTo(typeof(string));
return age > 10 ? (Student) new GoodStudent { Age = age, Name = name } : new BadStudent { Age = age, Name = name };
}
}
控制器动作
public ActionResult Index()
{
return View(new GoodStudent { Age = 13, Name = "John Smith" });
}
[HttpPost]
public ActionResult Index(Student student)
{
return View(student);
}
视图
@model AbstractTest.Models.Student
@using (Html.BeginForm())
{
<div id="StudentEditor">
<p>Age @Html.TextBoxFor(m => m.Age)</p>
<p>Name @Html.TextBoxFor(m => m.Name)</p>
<p><input type="button" value="Save" id="Save" /></p>
</div>
}
<script type="text/javascript">
$('document').ready(function () {
$('input#Save').click(function () {
$.ajax({
url: '@Ajax.JavaScriptStringEncode(Url.Action("Index"))',
type: 'POST',
data: GetStudentJsonData($('div#StudentEditor')),
contentType: 'application/json; charset=utf-8',
success: function (data, status, jqxhr) { window.location.href = '@Url.Action("Index")'; }
});
});
});
var GetStudentJsonData = function ($container) {
return JSON.stringify({
'Age': $container.find('input#Age').attr('value'),
'Name': $container.find('input#Name').attr('value')
});
};
</script>
添加到Global.asax.cs
protected void Application_Start()
{
...
ModelBinders.Binders.Add(new KeyValuePair<Type, IModelBinder>(typeof(Student), new StudentBinder()));
}
我目前正在尝试在Typo3 v10中获得一个扩展,它使用户能够显示、编辑、更新、禁用和启用其他用户帐户。 不幸的是,我遇到了一个问题,我不能使用禁用用户作为操作的参数: 这将导致以下错误:
问题内容: 我有以下任意JSON对象(字段名称可能会更改)。 -- 我知道我可以像定义具有相同字段名的JSON对象那样定义类,但是我希望控制器接受具有不同字段名的任意JSON对象。 问题答案: 如果您想将自定义JSON对象传递给MVC操作,则可以使用此解决方案,它的工作原理很吸引人。 该解决方案的真正好处是,您不需要为每个参数组合定义一个新类,并且除此之外,您可以轻松地将对象转换为其原始类型。 更
我可以让这段代码在没有对象作为抽象方法输入参数的情况下工作。例如,如果我亲自将方法的输入参数设置为,emp就会起作用。 当我将输入参数作为方法的对象时,它抛出了一个错误 emp不是抽象的,并且不会覆盖person类emp extends person{^
问题内容: 我知道spring数据存储库的实现: 创建一个像这样的接口: 现在是一个,我的项目中有(很多)更多目录。 我想知道是否可以制作1个适用于所有目录的存储库: 现在,有了保存,我不会直接看到问题,但是如果我要搜索一个,AbstractCatalog我已经确定我会碰壁的,因为回购协议将不知道他必须选择哪种对象。 AbstractCatalog.class Country.class 有谁知道
你好,我在TYPO3 7.6有一个扩展。我有两个行动列表和显示。在我的flexform中有一个可切换控制器action.list动作正在工作。但是显示行动不起作用。请检查我的代码。 柔性件 列表视图 我从列表页面的配置中选择列表,并从详细信息页面中选择详细信息。列表工作完美,但细节不工作。
问题内容: 在Java中,我可以做类似的事情 然后稍后在方法中“运行”代码。处理(匿名内部类)很痛苦,但是可以做到。 Go是否有可以促进函数/回调作为参数传递的内容? 问题答案: 是的,请考虑以下示例: 播放:http://play.golang.org/p/XNMtrDUDS0 导览:https : //tour.golang.org/moretypes/25(函数闭包)