我有一个很长的表单,大约有 9 对左右的单选按钮,由 AngularJS 绑定。它们看起来像这样:
<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 或空字符串。但是,情况并非如此,因为它在遇到新对象而不是字符串时会正确出错。
我的问题是:人们在发布数据时如何处理这个 AngularJS 单选按钮行为?关于如何让 JSON.Net 将该值序列化为任何有用的东西的任何想法?
如果需要,很高兴提供更多详细信息。
额外细节:
我有一个模型,例如 didPay 是一个布尔值?属性和一个视图模型,它被映射为字符串。
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 控制器将 viewmodel 作为参数并执行模型绑定魔术:
public HttpResponseMessage Post(ViewModel data)
{
var mappedData = Mapper.Map<ViewModel, Model>(data);
// save the data
// return response
}
基兰的建议给了我一个想法。我将 ViewModel 的属性类型更改为 object,现在它不再抱怨反序列化。所以这是解决了一个问题。我当前的问题是使用 Automapper 将 JObject 映射到一个Nullable<bool>
。我希望这是一件容易配置的事情。