1

MVC を使用して ASP.NET の作業を開始しています。アクション結果に書き込みます。そのうちの 1 つは HTTP GET で、もう 1 つは HTTP POST です。

    [HttpGet]
    public ActionResult DoTest()
    {
        Worksheet worksheets = new worksheets(..);
        return View(w);
    }

    [HttpPost]
    public ActionResult DoTest(Worksheet worksheet)
    {
        return PartialView("_Problems", worksheet);
    }

ここに画像の説明を入力

現在、ワークシート クラスには というプロパティがProblemsあり、これはコレクションですが、抽象クラス アイテムとして使用します。

public class Worksheet
{
    public List<Problem> Problems { get; set; }
}

これが私の抽象クラスと1つの実装です

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 つだけ取得する必要があります。しかし、上記の画像エラーがスローされました。

モデルバインダーが抽象クラスのその部分を回復できるようにするにはどうすればよいですか

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 に答える