AngularJS によってバインドされた、約 9 組のラジオ ボタンを含むかなり長いフォームがあります。それらは次のようになります。
<input type="radio" name="didPay" data-ng-model="model.didPay" value="True" />
<input type="radio" name="didPay" data-ng-model="model.didPay" value="False" />
ブラウザー開発ツールを使用すると、デフォルトで model.didPay が "{ }" に設定されていることがわかります。これは、バインドされたラジオ ボタンが意図しないデフォルト選択を行わないようにするためだと推測しています。オプションをクリックしてから手動で model.didPay の値を " { } " に設定すると、実際には選択が元の状態にリセットされます。ここまでは順調ですね。
私の問題は、以前の選択に基づいて一部のラジオ ボタンが非表示になっていることです。そのため、最良のシナリオでは、これらのラジオ ボタンの少なくとも 3 つを "{}" としてサーバーに投稿します。
サーバー側では、WebApi と JSON.Net で逆シリアル化を行っています。逆シリアル化中に、JSON.Net はエラーをスローします。
Exception {"Error reading string. Unexpected token: StartObject. Path 'didPay', line 1, position 91."}
System.Exception {Newtonsoft.Json.JsonReaderException}
宛先変数を文字列に設定することで、JSON.Net が "{ }" に遭遇した場合に null または空の文字列を割り当てることを期待していました。ただし、文字列ではなく新しいオブジェクトに遭遇すると正しくエラーになるため、これは当てはまりません。
私の質問は、データを POST するときに、この AngularJS ラジオ ボタンの動作をどのように扱っているかということです。JSON.Net を取得してその値を有用なものにシリアル化する方法についてのアイデアはありますか?
必要に応じて詳細をお知らせください。
追加の詳細:
たとえば、didPay が bool であるモデルがありますか? プロパティと、それが文字列としてマップされているビューモデル。
public class Model
{
public bool? DidPay { get; set; }
// rest of the props
}
public class ViewModel
{
public string DidPay { get; set; }
// rest of them props
}
私の WebApi コントローラーはビューモデルをパラメーターとして取り、モデル バインディング マジックを実行しています。
public HttpResponseMessage Post(ViewModel data)
{
var mappedData = Mapper.Map<ViewModel, Model>(data);
// save the data
// return response
}
キランの提案は私にアイデアを与えました。ViewModel のプロパティの型を object に変更したところ、逆シリアル化について文句を言わなくなりました。これで問題が 1 つ解決しました。私の現在の問題は、Automapper を使用して JObject を にマッピングすることNullable<bool>
です。簡単に設定できると思います。