8

私は次のように定義されたカスタムViewModelを持っています:

public class SampleFormViewModel
{
    public SampleFormViewModel(SelectList companies, Widget widget)
    {
        Companies = companies;
        Widget = widget;
    }

    public SelectList Companies { get; private set; }
    public Widget Widget { get; private set; }
}

Edit POSTハンドラーには、次のエントリがあります。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(SampleFormViewModel model)
{

編集フォームは次のように設定されます。

Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>"

そして、何が起こっているのかわからないまま、次のエラーが発生します。このオブジェクトにパラメーターなしのコンストラクターが定義されていません。確かに私はここで本当に明白な何かを見逃しています。背景として、GETは完全に機能し、SelectListからのドロップダウンを期待どおりに表示します。カスタムビューモデルへの自動バインドが失敗していると思いますが、どうしたらよいかわかりません。

4

2 に答える 2

8

パラメータのないコンストラクタが必要であり、プロパティにはパブリックセッターが必要だと思います。デフォルトのバインダーは、パラメーターを受け取らないコンストラクターを使用してオブジェクトを作成し、パブリックプロパティのリフレクションを使用して、フォーム/クエリパラメーターから値を設定します。

public class SampleFormViewModel
{
    public SampleFormViewModel() { }

    public SelectList Companies { get; set; }
    public Widget Widget { get; set; }
}

ただし、実際に実行したいのは、ビューモデルではなく、基になるウィジェットモデルを取得し、フォームの投稿でリスト値を選択することだと思います。バインダーはパラメーターで選択された値しか持っていないため、投稿時にSelectListを再構築できるとは思いません。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit( int CompanyID, Widget widget )
{
}
于 2009-04-19T13:40:50.487 に答える
2

MVCでは、強く型付けされたビューで、ビューがそのビューで使用されるクラスを作成できる必要があります。これは、パラメーターのないコンストラクターを意味します。そして、これは理にかなっています。MVCを初めて使用する人は、同様の「え?」を目にするでしょう。パラメータを公開するのを忘れた/失敗した場合の問題と、ビューがそれ自体をまとめようとしたときにポップアップするすべての関連エラー(コンパイラエラーではなく)。

しかし、このクラスのパラメーターなしのコンストラクターの問題で「興味深い」のは、クラスのプロパティにもパラメーターなしのコンストラクターがない場合です。これは悲観的なアプローチだと思いますか?

SelectListクラス(MVCに固有のクラス)である程度の学習時間を費やしたので、うまくいけば、何人かの人々が数分/時間を節約できるように手助けしたいと思いました。

ドロップダウンリストを作成するためのこの非常に重要なツール/クラスには、次のコンストラクタがあります。

public SelectList(IEnumerable items); public SelectList(IEnumerable items、object selectedValue); public SelectList(IEnumerable items、string dataValueField、string dataTextField); public SelectList(IEnumerable items、string dataValueField、string dataTextField、object selectedValue);

..したがって、これらがクラス(ビューに使用されるプロパティ)のプロパティである場合、MVCはとらえどころのない「パラメーターなしのコンストラクターなし」エラーを表示します。

ただし、ヘルパークラスのようなものを作成する場合は、元のクラスから正確なコードを切り取って貼り付けてから、そのヘルパークラスを元のクラスのパラメーター(get / setではない)にします。あなたは行ってもいいです。

このようにして、取得と投稿に単一のビューを使用できます。どちらがより美しいです:)

個人的には、強い型のビューの関連付けと要件を認識するコンパイラを作成するか、ドロップダウン(またはSelectListの他の「顧客」)が機能しないようにして、特定のレベルの再帰チェックがあるかどうか疑問に思います。パラメータレスコンストラクタについて。

ありがたいことに、現在のバージョンはトップレベルにすぎないようです。ハックのように感じます、そして私はそれが設計によるものであることを望みます。

HTH。

于 2010-09-21T17:23:31.090 に答える