为什么模型绑定器在POST后无法恢复抽象类?

时间:2013-01-10 16:08:27

标签: asp.net-mvc asp.net-mvc-4

我开始使用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);
    }

enter image description here

现在,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类的实现,但我真的只需要获取我的实现类的一个值。但它抛出了上面的图像错误。

我该怎么做才能让模型绑定器恢复我的摘要类的那部分

1 个答案:

答案 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()
                       });
}