如何设置C#模型以将属性转换为Knockout计算的observable

时间:2015-04-06 18:12:26

标签: c# knockout.js durandal

我们正在使用durandal将C#模型转换为Knockout视图模型进行渲染。我想知道是否有一种方法可以设置一个C#模型,其中包含具有set方法的属性,以便在我获得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在解释计算的observable时使用的主要示例。我理解如何在纯粹的JS viewmodel中实现这一点。但是,我想设置类似于我上面的C#模型(我不认为这实际上有效),以便找回已经具有它的依赖项的计算机。 / p>

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

3 个答案:

答案 0 :(得分:2)

Max Brodin提到KnockoutMVC这是一个巨大的反模式,你几乎失去了Knockout的所有好处,因为它几乎可以为你所做的一切创建服务器回调。

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

这些工具会将C#代码编译为Javascript,我只测试了DuoCode,但为它创建一个Knockout绑定非常容易。之后很容易创建像

这样的ViewModel
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);

答案 1 :(得分: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; }
    }
}

在剃须刀视图中,您应该致电:

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

@ko.Apply(Model)

答案 2 :(得分:0)

您似乎想要计算属性的自动转换。这是一个小便利的大问题。我想我可以用琐碎的表达式来做,但是你如何将.NET库方法(如string.Format)映射到javascript?您需要一个复制语义的客户端库。大工作,不值得努力。