我开始使用MVC开发ASP.NET。我写动作结果,其中一个是HTTP GET,另一个是HTTP POST
[HttpGet]
public ActionResult DoTest()
{
Worksheet worksheets = new worksheets(..);
return View(w);
}
[HttpPost]
public ActionResult DoTest(Worksheet worksheet)
{
return PartialView("_Problems", worksheet);
}
现在,Worksheet类有一个名为Problems
的属性,这是一个集合,但用作抽象类项。
public class Worksheet
{
public List<Problem> Problems { get; set; }
}
这是我的抽象类和一个实现
public abstract class Problem
{
public Problem() { }
public int Id { get; set; }
public abstract bool IsComplete { get; }
protected abstract bool CheckResponse();
}
public class Problem1 : Problem
{
...
public decimal CorrectResult { get; set; }
// this is the only property of my implementation class which I need
public decimal? Result { get; set;}
public override bool IsComplete
{
get { return Result.HasValue; }
}
protected override bool CheckResponse()
{
return this.CorrectResult.Equals(this.Result.Value);
}
}
我现在有很多Problem类的实现,但我真的只需要获取我的实现类的一个值。但它抛出了上面的图像错误。
我该怎么做才能让模型绑定器恢复我的摘要类的那部分
答案 0 :(得分:2)
以下代码无法编译:
var problem = new Problem();
...因为Problem
类是抽象的。 MVC引擎不能直接创建Problem
。除非你用某种方式知道要实例化哪种类型的Problem
,否则它无能为力。
可以创建自己的ModelBinder实现,并告诉MVC使用它。例如,您的实现可以绑定到依赖注入框架,以便在请求Problem1
类时知道创建Problem
。
或者你可以简单地改变你的行动方法来采取具体的类型:
public ActionResult DoTest(IEnumerable<Problem1> problems)
{
return PartialView("_Problems",
new Worksheet {
Problems = problems.Cast<Problem>().ToList()
});
}