c# – 使用ServiceStack的AngularJS友好返回类型的List和Dictionary

AngularJS无法绑定到值类型模型,如下所述:

> https://github.com/angular/angular.js/issues/1267
> Modifying an array within an object that’s displayed in a ng-repeat

在服务器端,我只有一个字符串列表:

[Route("/path/{Id}", "GET, OPTIONS")]
public class MyModel
{
    public int Id { get; set; }

    public List<string> SomeListItems { get; set; }
}

当我想通过ng-repeat绑定(使用ng-model到输入)到列表项时,它不起作用,因为ServiceStack将它们序列化为字符串数组.

是否可以告诉ServiceStack序列化程序将列表和字典序列化和反序列化为可与AngularJS绑定一起使用的对象?

例如.

{
    "id": 1,
    "someListItems": [
        { "value": "Item1" },
        { "value": "Item2" },
        ...
    ]
}

字典相同.

我发现的唯一解决方案是返回List< KeyValuePair< string,string>>但这在服务器端非常难看.

解决方法:

为什么需要将字符串列表转换为关联数组? AngularJs可以处理迭代数组.

这是一个展示:http://plnkr.co/edit/TcXxSBkt7NBkqNJhkSE1的plnkr

实质上,服务器返回对象,属性SomeListItems是一个数组.

使用ng-repeat迭代它们

<ul>
    <li ng-repeat="item in data.SomeListItems">{{item}}</li>
  </ul>

我看到了这个问题的几个解决方案,要么按摩客户端或服务器上的数据结构.

Here’s a plnkr显示将从服务器接收的字符串数组转换为关联数组,以便可以在客户端上进行编辑,然后重新转换回单维数组以便发布到服务器.

相反,您可以在服务器上执行此操作.如果你将SomeListItems声明为动态列表,那么你可以为它分配任何你想要的东西,包括匿名对象,ServiceStack序列化程序应该能够处理它(我没有测试过,但是我觉得它会起作用).

[Route("/path/{Id}", "GET, OPTIONS")]
public class MyModel
{
    public int Id { get; set; }

    public List<dynamic> SomeListItems { get; set; }
}

// in a controller or service
var model = new MyModel() { Id = 1 };
model.SomeListItems =  new List<dynamic> {
  new { Key = 1, Value = "foo }, new {Key = 2, Value = "bar" }
}; // this should serialize to JSON as { Id: 1, SomeListItems: [ {Key: 1, Value: 'foo'}, {Key:2, Value = 'bar'}]}; which angular can handle nicely

或者,您可以指定一个比KeyValuePair更简洁的自定义类< string,string>

public class JsonPayload
{ // yes, it's just a KVP, but it's much more concise
  public string Key {get;set;}
  public string Value {get;set;}
}

然后重新定义您的模型

[Route("/path/{Id}", "GET, OPTIONS")]
public class MyModel
{
    public int Id { get; set; }

    public List<JsonPayload> SomeListItems { get; set; }
}

这比使用动态更冗长,但JSON序列化应该能够处理这个问题.

上一篇:c# – ServiceStack完成noob教程


下一篇:python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别