1

これが正しい方法かどうかはわかりませんが、JqueryとMVC2を使用しています。$ .ajaxメソッドを使用してコントローラーにコールバックし、テキストボックスの.blurでビジネスロジックを実行しています。

共通のデータで基本的に同じことを行う2つのビューがありますが、異なるモデルを使用しています。どちらも同じコントローラーを使用しています。コードで説明する方が簡単かもしれません:

したがって、ここに2つのモデルがあります。

public class RecordModel {
    public string RecordID { get; set; }
    public string OtherProperties { get; set; }
}

public class SecondaryModel {
    public string RecordID { get; set; }
    public string OtherPropertiesDifferentThanOtherModel { get; set; }
}

これらのモデルに強く型付けされている2つのビューがあります。1つはRecordModelで、もう1つはSecondaryModelです。

これらのビューには、次の方法で作成されたinput="text"があります。

<%= Html.TextBoxFor(model => model.RecordID) %>

.blurメソッドを呼び出しにバインドするjQueryjavascriptがあります。

<script>
    $('#RecordID').blur(function() {
        var data = new Object();
        data.RecordID = $('#RecordID').val();
        // Any other stuff needed

        $.ajax({
            url: '/Controller/ValidateRecordID',
            type: 'post',
            dataType: 'json',
            data: data,
            success: function(result) {
                 alert('success: ' + result);
            },
            error: function(result) {
                 alert('failed');
            }
         });
      }
 </script>

コントローラは次のようになります。

[HttpPost]
public ActionResult ValidateRecordID(RecordModel model) {
    // TODO: Do some verification code here

    return this.Json("Validated.");
}

RecordModelを使用するビューのコントローラーでRecordModelに明示的に名前を付けると、これは正常に機能します。ただし、SecondaryModelビューもこの関数を呼び出そうとしますが、SecondaryModelではなくRecordModelを予期しているため、失敗します。

だから私の質問はこれです。2つの異なる強く型付けされたビューが、コントローラーで同じアクションを使用し、モデリングパターンを順守するにはどうすればよいですか?抽象クラスとインターフェースを試しましたが(そして、インターフェース/抽象クラスを使用するようにビューページを変更しました)、それでも失敗します。

何か助けはありますか?そして、投稿の堅牢性について申し訳ありません...

ありがとう。

4

4 に答える 4

1

これらのクラスのインターフェースを定義できます。

interface IRecord
{
    string RecordID { get; set; }
    string OtherProperties { get; set; }
}

そして、それを使用してメソッドにモデルを受信させます。

[HttpPost]
public ActionResult ValidateRecordID(IRecord model) 
{
    // TODO: Do some verification code here

    return this.Json("Validated.");
}
于 2011-01-26T19:20:58.180 に答える
0

データをインターフェース/抽象クラスにバインドする直接的な方法はありません。DefaultModelBinderはその型をインスタンス化しようとしますが、これは(定義上)不可能です。

したがって、私見では、そのオプションを使用しないでください。また、2つのビュー間で同じコントローラーアクションを共有する場合は、通常、ViewModelを使用します。

強く型付けされたビューがそのビューモデルを参照するようにします。単一の共有アクションにそのインスタンスを受信させます。アクション内で、どの「実際の」モデルを使用するかを決定します...

投稿の送信元(ビュー1または2)を区別するためにパラメーターが必要な場合は、そのパラメーターをajax呼び出しURLに追加するだけです。

もちろん、別の方法は、すでに試したもの(インターフェイス/抽象クラス)を保持することですが、その場合はカスタムモデルバインダーが必要になります...私にはオーバーコーディングのように聞こえますが、それはあなたの選択です。

編集私の親愛なるSO仲間の@CharlesBoyungが以下に優雅な(そして間違った)コメントをした後、私は私の答えが正確ではなかったという結論に達しました。そこで、ここで使用した用語のいくつかを修正しました。これで、より明確になることを願っています。

于 2011-01-26T19:18:34.463 に答える
0

RecordIDのみが必要な場合は、コントローラーメソッドにint RecordIDを取得させるだけで、ビューモデルをバックアップしてアクションメソッドに提供する代わりに、フォームの投稿データからそれを取得できます。

[HttpPost]
public ActionResult ValidateRecordID(int RecordID) {
    // TODO: Do some verification code here

    return this.Json("Validated.");
}
于 2011-01-26T19:19:36.867 に答える
0

上記の場合、アクションは具象型の代わりに2つの文字列を受け入れることができます。

もう1つの可能性は、2つのアクションを持つことです。あなたのタイプの1つをとる各行動。それぞれのタイプの機能は基本的に同じだと思います。値が抽出されたら、それらをメソッドに渡します。あなたの場合、メソッドはおそらく各アクションで同じになります。

public ActionResult Method1(Record record)
{
ProcessAction(record.id, record.Property);

}

public ActionResult Action2(OtherRecord record)
{

ProcessAction(record.id, record.OtherProperty);

}


private void ProcessAction(string id, string otherproperity)
{
//make happen
}
于 2011-01-26T20:36:29.050 に答える