1

我有一个很长的表单,大约有 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>。我希望这是一件容易配置的事情。

4

2 回答 2

0

Automapper 自定义类型转换器成功了。

于 2013-11-01T21:21:34.953 回答
0

尝试使用 DeserializeObject 将 json 对象(字符串)转换为 .net 对象的类型。

示例:将 json 字符串对象转换为 Dictionary 对象。

Dictionary<string, object> result = JsonConvert.DeserializeObject<Dictionary<string, object>>(strJsonresults);
于 2013-11-01T20:17:53.537 回答