4

空の値とまったく言及されていない値を区別する方法はありますか?

たとえば、クライアントがプロファイルを更新し、リクエストで指定された値にのみ影響を与えることができるようにしたいと思います...空/nullのものでも。

name="Sherlok" および Birthdate="January 6" のプロファイルが与えられた場合:

POST api/profiles/update?name=Sherlock >> only modifies name

POST api/profiles/update?birthdate=&name=Sherlock >> modifies name AND clears birthdate

これら 2 つの状況で生年月日パラメーターを区別する方法はありますか、それとも魔法の値に頼る必要がありますか?

4

2 に答える 2

1

これを行うには、実際にはかなりの数の方法があります。

  1. @Badriが示唆したようRequestに、アクションでオブジェクトを直接使用できます。これは非常に簡単でシンプルなアプローチですが、コントローラー ロジックと書式設定/バインド ロジックが混在しています。懸念事項をより適切に分離したい場合は、次のいずれかを試してください。
  2. 選択できるパラメータ バインド メカニズムは多数あります。この場合、カスタム モデル バインダーがうまく機能するように見えます。モデル バインダーのオブジェクトにアクセスし、Request@Badri のコードに似たものを使用して、期待する値 (String.Emptyまたはnull) をアクションに渡す前に設定できます。
  3. 生年月日フィールドの値プロバイダーは、より適切なオプションである可能性があります。最終的に DateTime オブジェクトに変換できる文字列を渡しています。そのパラメーターでカスタム値プロバイダー ( などIntuitiveDateTimeValueProvider) を使用するように指定した場合、実際にはアクション内のパラメーターの型をDateTimeor Nullable<DateTime>( DateTime?) に変更し、値プロバイダーに値を適切に入力させることができます。空と null を区別したい単純な文字列 (例: ExistenceTestingStringValueProvider) にも同様の戦略を使用できます。
  4. 追加のルート/アクションを作成します。可能な組み合わせが多すぎるため、パラメーターが多数ある場合、これは適切なオプションではありませんが、数が少ない場合、これは非常に単純なソリューションです。これを行う 1 つの方法は、組み合わせごとにメソッドのオーバーロードを単純に作成することです。のみを持つオーバーロードnameがヒットしbirthdateた場合、それは指定されなかったことを意味しますが、両方のパラメーターを持つオーバーロードがヒットしたbirthdate場合、その値が であっても、指定されたことを意味しnull、指定されたが空のパラメーター値を区別する方法を提供しますおよび未指定のパラメーター値。
于 2014-02-26T01:24:02.933 に答える
0

ASP.NET Web API バインディングを使用する場合、それは不可能です。たとえば、DTO クラスがあり、それを次のようなバインドに使用するとします。

public class MyDto
{
    public string Name { get; set; }
    public string BirthDate { get; set; }
}

public void Update([FromUri]MyDto dto) { }

省略しBirthDateたり、空の値でクエリ文字列に含めたりすると、基本的に同じでBirthDate、どちらの場合もプロパティは null になります。ただし、このようにクエリ文字列を自分で読み取ることができます。

string qs = Request.RequestUri.Query.Substring(1); // leave out ?
var pairs = System.Web.HttpUtility.ParseQueryString(qs);

この場合、pairs["BirthDate"]クエリ文字列からフィールドを除外すると (?name=Sherlock)、null になります。

クエリ文字列に空の値 (?birthdate=&name=Sherlock) をpairs["BirthDate"]指定すると、空の文字列 ("") になります。

于 2014-02-25T05:13:14.863 に答える