非表示のテキスト ボックスで、JSON を介してビュー モデルからコントローラーに情報を渡すことができるようにしたいと考えています。Google Maps API でポリゴンを扱っています。ユーザーがポリゴンを編集すると、javascript を介して非表示の入力に頂点が保存されます。
var p = mypolygon.getPath().getArray();
var s = '';
for (var i = 0; i < p.length; i++)
s += ((i > 0) ? ', ' : '') + '{ lat: ' + p[i].lat() + ', lng: ' + p[i].lng() + ' }';
$('#@Html.IdFor(m => m.GeofencePoints)').val('[' + s + ']');
その結果、次のようになります。
<input id="GeofencePoints" name="GeofencePoints" type="hidden" value="[{ lat: 38.221276965853264, lng: -97.6892964859955 }, { lat: 38.21294239796929, lng: -97.68770861825868 }, { lat: 38.2122680083775, lng: -97.67782997884831 }, { lat: 38.220434074436966, lng: -97.67787289419255 }]">
次のビューモデルをビューにバインドしたいと思います:
public class MyMapViewModel
{
public GoogleMapPoint[] GeofencePoints {get;set;}
public string OtherProperty {get;set;}
}
public class GoogleMapPoint
{
public double lat {get;set;}
public double lng {get;set;}
}
プロパティの 1 つだけを Json として投稿したいので、これは私が見た例とは少し異なります。誰かが私を正しい方向に向けることができますか? 文字列として渡して、自分でシリアル化/逆シリアル化できることはわかっています。ただし、エレガントな顧客モデル バインダー ソリューションを期待していました。
アップデート
私が見つけたこの投稿に基づいて、一般的な解決策を見つけました: http://mkramar.blogspot.com/2011/05/mvc-complex-model-postback-bind-field.html
public class JsonBindableAttribute : Attribute
{
}
public class MyModelBinder : DefaultModelBinder
{
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
if (propertyDescriptor.Attributes.OfType<Attribute>().Any(x => (x is JsonBindableAttribute)))
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
return JsonConvert.DeserializeObject(value, propertyDescriptor.PropertyType);
}
return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}
}
私のモデルでは:
[JsonBindable]
[UIHint("GoogleMapPoints")]
public GoogleMapPoint[] GeofencePoints { get; set; }
そして、global.asax Application_Start() で
ModelBinders.Binders.DefaultBinder = new MyModelBinder();
残念ながら、これはこれまでのところ私を得るだけです。これにより、フォームの値がクラスにうまくバインドされます。ただし、プロパティを Json としてレンダリングすることは解決しません。ご覧のとおり、カスタム エディター GoogleMapPoints.cshtml を作成しました。これは基本的に、jsonbindable として持つクラスごとに再作成する必要があります。
@model IEnumerable<GoogleMapPoint>
@Html.Hidden("", Newtonsoft.Json.JsonConvert.SerializeObject(Model))
タイプ/クラスに関係なく、JsonBindable 属性で色付けされたプロパティの EditorFor が常に非表示フィールドで Json としてレンダリングされるように、タイプではなく属性に注意を払う汎用カスタム エディターを使用する方法を知っている人はいますか?