1

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

我现在有很多问题类的实现,但我真的只需要获得我的实现类的一个值。但它抛出了上述图像错误。

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

4

1 回答 1

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()
                       });
}
于 2013-01-10T16:10:14.820 回答