1

私はノックアウトを使用していますが、使用しているモデルには多くのアイテムが含まれています。次のようにコントローラーに投稿しています:

ajaxRequest("post", "/api/care/saveevent?student=" + self.StudentId(),self.CurrentEvent())
                .done(function (allData) {
                    alert("ran ok");
                })
                .fail(function () {
                    alert("An error occurred");
                });

そして、私のコントローラーにはこれがあります:

public string SaveEvent(object data, int student)
{
    return "test";
}

オブジェクトを使用して、ノックアウト モデルのすべてをコントローラーやその他の場所に複製する必要がないようにして、一度変更できるようにしたいと考えています。

OK を投稿し、オブジェクト データ内のすべてのデバッグが正しい場合。ただし、通常はオブジェクトを使用せず、その内容をそのまま取得する方法がわかりません.data.PropertyNameを入れるだけでインテリセンスエラーが発生します.

その内容を取得する正しい方法は何ですか?私がやろうとしていることは不可能ですか?

4

3 に答える 3

4

厳密に型指定された (C#) モデル クラスを避けたい場合は、dynamic型を使用できます。

ただし、モデル バインド対象のプロパティを持つクラスを作成することをお勧めします。その場合、2 か所で変更を加える必要がありますが、IntelliSense などのすべての利点が得られます (さらに、サーバー側を変更せずにクライアント側の JavaScript コードにプロパティを追加するだけでは、ほとんどの場合、おそらく不十分です。 .)

于 2013-09-30T15:15:00.907 に答える
0

ViewModel を使用してデータ オブジェクトを処理することをお勧めします。

次のような ViewModel が与えられます。

public class SaveEventViewModel
{ 
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

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

public string SaveEvent(SaveEventViewModel data, int student)
{
    SaveEvent(data, student); // I am assuming this will occur
    return JsonConvert.SerializeObject(data);
}

ViewModel を定義する利点は、allData (クライアント側) からモデルのすべてのメンバーに簡単にアクセスできることです。

allData.Start
allData.End

動的なアプローチは問題なく機能するため、代替手段を提供したかっただけですが、ViewModel アプローチを好みます。

(JsonConvert は Newtonsoft.Json ライブラリからのものであることに注意してください)

于 2013-09-30T15:28:32.567 に答える
0

部分的な更新だけが必要な場合は、OData を使用することをお勧めします。

これについての議論があります。

その例からコピーされたコード:

[AcceptVerbs("PATCH")]
public void Patch(int id, Delta<Person> person)
{
    var personFromDb = _personRepository.Get(id);
    person.Patch(personFromDb);
    _personRepository.Save();
}

PATCHhttp動詞を使用して部分モデルを送信します。このようにして、型付きクラスを最大限に活用しながら、ネットワーク オーバーヘッドを削減しました。

patchajax 呼び出しを行うときは、動詞を使用することを忘れないでください。

$.ajax({
    url: 'api/person/1',
    type: 'PATCH',
    data: JSON.stringify(obj),
    dataType: 'json',
    contentType: 'application/json',
    success: function(callback) {            
       //handle errors, do stuff yada yada yada
    }
});

利点は、値が変更されたプロパティのみを含む obj を渡すことができることです。ただし、型付きクラスにバインドされます。

于 2013-09-30T15:20:24.317 に答える