在开发Web应用程序时,经常需要处理复杂的数据模型。例如,可能需要将一个包含多个复杂对象的数组提交到服务器。在ASP.NET MVC框架中,可以使用Model Binding来实现这一功能。本文将介绍如何在ASP.NET MVC中处理复杂的对象模型,并通过表单提交将JSON字符串绑定到模型属性。
首先,需要定义一个复杂的数据模型。在C#中,可以使用类来定义模型。例如,有一个名为ComplexModel
的类,它包含两个简单的字符串属性FirstName
和LastName
,以及一个复杂的对象列表ComplexData
。
public class ComplexModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
[JsonBindable]
public List ComplexData { get; set; }
}
接下来,需要创建一个控制器来处理表单提交。在控制器中,定义了一个名为Save
的方法,该方法接收一个ComplexModel
对象作为参数。
public class ComplexController : Controller
{
public ViewResult Save(ComplexModel model)
{
// save it
}
}
在视图中,需要将FirstName
和LastName
属性绑定到输入框,并将ComplexData
属性的值在表单提交前转换为JSON字符串并放置在隐藏字段中。
<script>
$(document).ready(function() {
$('form').submit(function() {
var complexData = getMyComplexDataObject();
$('input[name=ComplexData]').val(JSON.stringify(complexData));
});
});
</script>
<form>
<input name="FirstName" />
<input name="LastName" />
<input type="hidden" name="ComplexData" />
<input type="submit" value="Save!" />
</form>
将JSON字符串绑定到ComplexObject
属性是一个挑战。为了解决这个问题,创建了一个自定义属性JsonBindableAttribute
和一个自定义模型绑定器JsonPropBinder
。
public class JsonBindableAttribute : Attribute
{
}
public class JsonPropBinder : DefaultModelBinder
{
protected override object GetPropertyValue(ControllerContext controllerContext,
ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor,
IModelBinder propertyBinder)
{
if (propertyDescriptor.Attributes.OfType()
.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);
}
}
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(ComplexModel), new JsonPropBinder());
}