如何在Knockoutjs中访问asp.net表单服务器端变量

时间:2014-08-27 08:11:44

标签: c# asp.net knockout.js javascript

我是Knockoutjs的新手。我刚刚经历Live examples

有人可以告诉我如何在Knockoutjs中访问asp.net服务器端代码。

假设我有以下代码asp.net并希望填充

  

的helloWorld

  

列表

到Knockoutjs。

string helloWorld = "Hello world";
List<string> list = new List<string>();
list.Add("US");
list.Add("UK");
list.Add("Canada");

2 个答案:

答案 0 :(得分:1)

你不能吗?您需要将服务器端变量作为对客户端的响应(本例中的浏览器)发送回来

如果您正在使用RESTful WCF / MVC / Web API,那么您是否阅读了很多关于DataContracts?的内容。您还可以使用SignalR向客户端发送消息。

无论采用何种技术,您都无法绑定存储在服务器内存中的变量

答案 1 :(得分:0)

我正在使用DataContractJsonSerializer(来自System.Runtime.Serialization.dll)。

您可以编写实用程序类来封装逻辑,例如:

public class JavaScriptStringSerializer {

  public string SerializeString<T>(T value) {
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
    byte[] buffer;
    using (MemoryStream stream = new MemoryStream())
    {
      serializer.WriteObject(stream, value);
      buffer = stream.ToArray();
    }
    return Encoding.UTF8.GetString(buffer);
  }

  public T DeserializeString<T>(string value) {
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
    T result;
    byte[] buffer = Encoding.UTF8.GetBytes(value);
    using (MemoryStream stream = new MemoryStream(buffer, false)) {
      result = (T)serializer.ReadObject(stream);
    }
    return result;
  }
}

然后在.aspx页面声明文字像

<script type="text/javascript">
    $(function () {
       var oData = <asp:Literal ID="litServerModel" runat="server" Mode="PassThrough" />;
       // do something with oData - like bind viewmodel, etc
    });
</script>

在代码隐藏中:

var serializer = new JavaScriptStringSerializer();
litServerModel.Text = serializer.SerializeString<List<string>>(new List<string> { 
  "aa", 
  "bb", 
  "cc" 
});

对于更复杂的对象,您必须使用DataContract / DataMember属性正确装饰它们,例如:

[DataContract]
public class Point { 
  [DataMember]
  public int X { get; set; }
  [DataMember]
  public int Y { get; set; }
}

litServerModel.Text = serializer.SerializeString<Point>(new Point { 
  X = 1, 
  Y = 2 
});