Asp.net mvc 4 在MVC4中使用敲除MVC将数据与嵌套对象绑定
我正在使用Asp.net mvc 4 在MVC4中使用敲除MVC将数据与嵌套对象绑定,asp.net-mvc-4,knockout.js,knockout-mvc,Asp.net Mvc 4,Knockout.js,Knockout Mvc,我正在使用Knockout MVCfrom将Knockout集成到我的网站,但我有一个问题。如果我的模型包含另一个对象,绑定将不成功。例如,以下是我的模型: public class HelloWorldModel { public string FirstName { get; set; } public string LastName { get; set; } [Computed] public string FullName {
Knockout MVC
from将Knockout集成到我的网站,但我有一个问题。如果我的模型包含另一个对象,绑定将不成功。例如,以下是我的模型:
public class HelloWorldModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
[Computed]
public string FullName
{
get { return FirstName + " " + LastName; }
}
public ProductModel ProductModel { get; set; }
}
这是我的ProductModel
public class ProductModel
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int CategoryId { get; set; }
public bool IsActive { get; set; }
}
这些模型只是为了测试,所以它们非常简单。以下是我要显示的视图:
@using PerpetuumSoft.Knockout
@model MyStore.UI.Models.HelloWorldModel
@{
ViewBag.Title = "HelloWorld";
var ko = Html.CreateKnockoutContext();
}
<p>
Name: @ko.Html.TextBox(x => x.ProductModel.Name)
</p>
<p>
Price: @ko.Html.TextBox(x => x.ProductModel.Price)
</p>
<h2>
Product @ko.Html.Span(x => x.ProductModel.Name), @ko.Html.Span(x => x.ProductModel.Price)
</h2>
<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)
多亏了nemesv的评论,我找到了解决方案。要访问嵌套对象,这里是
产品
,我们使用和
绑定。以下是视图的代码:
@using (var product = ko.With(x => x.ProductModel))
{
<p>
Name: @product.Html.TextBox(x => x.Name)
</p>
<p>
Price: @product.Html.TextBox(x => x.Price)
</p>
<h2>
Product @product.Html.Span(x => x.Name), @product.Html.Span(x => x.Price)
</h2>
}
<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>
@使用(var product=ko.With(x=>x.ProductModel))
{
名称:@product.Html.TextBox(x=>x.Name)
价格:@product.Html.TextBox(x=>x.Price)
Product@Product.Html.Span(x=>x.Name),@Product.Html.Span(x=>x.Price)
}
名字:@ko.Html.TextBox(m=>m.FirstName)
姓氏:@ko.Html.TextBox(m=>m.LastName)
您好,@ko.Html.Span(m=>m.FullName)!
提示一下,淘汰MVC是一个巨大的反模式。不要这样做。它是网络表单的私生子。我们一直在努力摆脱Web表单,KO MVC为我们带来了backBut,但现在,我不得不使用它:(这是一个已知的、可悲的、开放的淘汰MVC库问题,请参见:作为一种解决方法,可以使用with binding:@using(var subModel=KO.with(m=>m.ProductModel)){@subModel.Html.TextBox(x=>ko.Model..Name)
谢谢你的建议,我找到了解决方案。太好了!让我来回答:)
var viewModelJs = {"FirstName":"AAA","LastName":"BBB","FullName":"AAA BBB","ProductModel":{"Id":0,"Name":"Coca Cola","Price":123.0,"CategoryId":0,"IsActive":false}};
@using (var product = ko.With(x => x.ProductModel))
{
<p>
Name: @product.Html.TextBox(x => x.Name)
</p>
<p>
Price: @product.Html.TextBox(x => x.Price)
</p>
<h2>
Product @product.Html.Span(x => x.Name), @product.Html.Span(x => x.Price)
</h2>
}
<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>