0

サイトの登録フォームにインターフェイスを追加したいと考えています。それを IShape と呼びましょう。ISquare や ICycle などのサーバル インターフェイスの実装があり、インターフェイスで宣言された共有のものを除いて、それぞれに独自のプロパティがあります。

私は、ユーザーが可能なすべての型から必要な数の形状を持ち、RegisterModel として受け取った情報を入力できるようにしたいと考えています。

public class RegisterModel
{
    [Required]
    [Display(Name = "Username")]
    public string UserName { get; set; }

    [Required]
    [Display(Name = "Shapes")]
    public List<string> Shapes { get; set; }
}

登録アクション:

public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
              // Iterate over the shapes
              model.Shapes ...
            }
        }

複数のオブジェクトがある場合、それらの名前が競合するため、JavaScript の問題を参照してください。例: 2 つの形状には size プロパティがあります。「サイズ」という名前のテキスト ボックスを 2 つ作成すると、ASP.NET エンジンはそれを解決できません。

ありがとう!

4

3 に答える 3

1

フロントエンドにKnockout.jsを使用して、ユーザーがオブジェクトのリストを作成できるようにすることを検討します。これは、クライアント側のイベントを管理し、DOM を操作できるようにする MVVM フレームワークです。

サーバーが追加する新しい形状ごとに (onclick イベントで) ajax 要求をサーバーに送り返すことができます。次に、ユーザーがデータベースまたはセッションで構築しているリストを永続化する必要がありますが、ユーザーが確認/送信を押すと、すでに完全なリストにアクセスできるため、すべてのアイテムを一度に簡単に検証できます.

于 2012-09-06T22:14:31.550 に答える
1

MVC フレームワークがインターフェイスをモデル バインドすることをどの程度正確に期待しますか? モデル バインディングが機能するためには、MVC はオブジェクトのどのインスタンスを作成する必要があるかを認識している必要があります。それを行うための十分な情報がインターフェイスにないため、カスタム モデル バインダーが必要になります。

ほとんどの MVC 機能は構成よりも規則に基づいているため、MVC がすぐに使用できるすべての生産性機能を本質的にオーバーライドするパスをたどることについて話しているのです。インターフェースに規則を設けるのは難しいです。

できないと言っているわけではありませんが、おそらくもっと良い方法があります。

于 2012-09-06T22:09:38.583 に答える
0

私はある程度理解していると思いますが、それは非常に合理的ですが、インターフェイスをインスタンス化することはできず、それを実装するクラスのみがインスタンス化できるため、インターフェイスを使用することはそれを行う方法ではありません。

あなたがする必要があると思うのは、インターフェイスではなく継承を使用することです。

Circle、Squareなどが派生する基本抽象Shapeクラスがあります。入力フォームで、ユーザーは喜んで円または正方形を選択でき、コントローラーで処理する Shape 型の適切な統合 IList を取得できます。

これを行うには、抽象クラスをバインドしようとしていることを検出し (これは実行できません)、CreateModel をオーバーライドして Square または Circle 型の新しいクラスを提供するカスタム モデル バインダーを作成する必要があります。その MVC がバインドする)。

このテクニックのかなり完全で詳細な議論がここにあります

于 2012-09-06T22:52:32.827 に答える