2015-04-06 43 views
0

我们使用durandal将C#模型转换为Knockout视图模型进行渲染。我想知道是否有一种方法可以设置具有set方法或属性的C#模型,以便在获取Knockout视图模型时已经存在绑定和依赖关系。如何设置C#模型将属性转换为Knockout计算的可观察对象

我想这样的情景发生。

public class MyObject{ 
    public string FirstName{get; set;} 
    public string LastName {get; set} 
    private string fullName{get; set;} 
    public FullName{ 
    get{return fullName;} 
    set{fullName = FirstName +" "+LastName} 
    } 

我已经使用了Knockout在解释计算的observables时使用的主要示例。我明白如何在纯JS视图模型中实现这一点。不过,我想设置我的C#模型,类似于上面的(我认为这实际上不起作用),以便找回已经具有它的依赖关系的计算。

我不完全确定这是可能的,但它肯定会很好。

+0

请问您可以添加一个你想达到的结果的小例子吗? –

回答

1

这个想法很好,但它不适用于真实世界的项目。您的C#代码需要转换为JavaScript,并且可以用于像您这样的简单案例。但是,如果你改变你的计算属性更复杂一些,你会有问题。

有一个knockoutmvc project提供这样的功能。他们有hello world样本,看起来像你可以用作开始的东西。你只需要标记与属性你的财产

public class HelloWorldModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [Computed] 
    [ScriptIgnore] 
    [JsonIgnore] 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
} 

而且在Razor视图,你应该叫:

@{ 
    var ko = Html.CreateKnockoutContext(); 
} 

@ko.Apply(Model) 
+0

看看这个例子,http://knockoutmvc.com/ClickCounter检查Chome控制台中的网络标签。每次点击都会生成服务器往返 – Anders

2

最大布洛顿提到KnockoutMVC这是一个巨大的反模式,你,因为它失去了几乎所有的优点与淘汰赛为您几乎所有的事情创建服务器回调。

一个更好的选择是使用例如DuoCode或开源替代品WootzJs

这些工具将编译C#代码为Javascript,我只测试DuoCode但它是farily容易创建淘汰赛为它具有约束力。之后,它很容易创建的ViewModels像

using Knockout; 

namespace ViewModels 
{ 
    public class FooViewModel 
    { 
      private readonly Observable<string> bar;   
      private readonly Observable<string> computed;   

     public FooViewModel() 
     { 
      bar = Global.Observable("HelloWorld"); //Translates to ko.observable("HelloWorld") on client 
      computed = Global.Computed(() => bar.Get() + "COMPUTED"); 
     } 

     public Observable<string> Bar { get { return bar; } } 
     public Observable<string> Computed { get { return computed; } } 
    } 
} 

我也创建绑定ko.mapping像

Mapping.Map(new { bar = "DataFromserver" }, null, this);它转换为 ko.mapping.fromJS({ bar = "DataFromserver" }, null, this);客户端

0

你似乎想的计算机自动翻译属性。这是一个小方便的重要要求。我认为我可以为平凡的表达式做到这一点,但是如何将.NET库方法(如string.Format)映射到JavaScript?您需要一个客户端库来复制语义。很大的工作,不值得付出努力。

相关问题