2012-07-12 39 views
2

我们目前正在写我们的MVC客户端的新的基础设施,我们正在努力使它所以开发商也不会需要右键多的Javascript(目前的发展池主要是基于桌面的)生成淘汰赛标记在MVC 3

到目前为止,我们对于我们的淘汰赛脚本所做的工作就是创建一个扩展方法,该方法基于使用反射的模型基本生成所有淘汰赛内容。对于没有计算值的简单模型而言,这种方法非常合适,并且工作得非常好。

因此,例如,说我们有这个类

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

下将生成并添加到视图

function AppViewModel() { 
    this.firstName = ko.observable('Bob'); 
    this.lastName = ko.observable('Smith'); 
    } 

什么编号真正想要做的是从模型支持计算值..但我只是不知道怎么办

所以

public FullName() 
{ 
return this.FirstName + " " + this.LastNAme 
} 

会产生类似

this.fullName = ko.computed(function() { 
     return this.firstName() + " " + this.lastName(); 
    }, this); 

所以刚才讲清楚 - 我想要做的是基于我的模型计算值。

感谢您的任何帮助

欢呼声。 ste。

+0

我想知道,你有没有试着用淘汰赛映射插件??? – Jupaol 2012-07-12 10:20:49

+0

@Jupaol - 我已经尝试过,但它仍然没有提供计算值悲伤..虽然欢呼。 – Steoates 2012-07-12 10:29:27

回答

4

进一步什么帕维尔上面提到的,是表示一个“T”您的方案一个很好的例子:

http://knockoutmvc.com/HelloWorld

这里是从页面转录:

型号:

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

    public Expression<Func<string>> FullName() 
    { 
    return() => FirstName + " " + LastName; 
    } 
} 

剃刀:

@using PerpetuumSoft.Knockout 
@model KnockoutMvcDemo.Models.HelloWorldModel   
@{ 
    var ko = Html.CreateKnockoutContext(); 
} 
<p>First name: @ko.Html.TextBox(m => m.FirstName)</p> 
<p>Last name: @ko.Html.TextBox(m => m.LastName)</p> 
<h2>Hello, @ko.Html.Span(m => m.FullName())!</h2> 

@ko.Apply(Model) 

控制器:

public class HelloWorldController : BaseController 
{ 
    public ActionResult Index() 
    { 
    InitializeViewBag("Hello world"); 
    return View(new HelloWorldModel 
    { 
     FirstName = "Steve", 
     LastName = "Sanderson" 
    }); 
    } 
} 

自动生成的HTML:

<p> 
    First name: 
    <input data-bind="value : FirstName" /></p> 
<p> 
    Last name: 
    <input data-bind="value : LastName" /></p> 
<h2> 
    Hello, <span data-bind="text : FullName"></span>!</h2> 

<script type="text/javascript"> 
    var viewModelJs = { "FirstName": "Steve", "LastName": "Sanderson" }; 
    var viewModel = ko.mapping.fromJS(viewModelJs); 
    viewModel.FullName = ko.computed(function() { 
     try { 
      return this.FirstName() + ' ' + this.LastName(); 
     } 
     catch (e) { return null; }; 
    }, viewModel); 
    ko.applyBindings(viewModel); 
</script> 
+0

这是一个很好的回答(有很好的例子),但是我想说一边我不认为'名字:@ ko.Html.TextBox(m => m.FirstName)'less比'First name:'复杂,开发者仍然需要用第一种方法来理解HTML。这更多的是对问题的批评,而不是你的回答。 – Arbiter 2012-07-12 14:18:06

+0

仲裁者 - 很好的想法。正如你所说,最终的游戏是让相对较少经验的开发人员掌握后端功能,而在前端则更少。当然,这里的html是由助手('@ ko.Apply(Model)) )生成的,所以对于一些现存的可能工作,只要这些人遵循编码实践,直到他们精神上100%地掌握下面发生的事情封面。 – 2012-07-12 16:45:14