2013-08-02 4 views
2

J'ai un site ASP.NET MVC et j'essaye de faire fonctionner knockout-mvc avec.knockoutmvc - impossible d'analyser les liaisons

J'ai créé un modèle Voir dans le code C# appelé Refund qui contient entre autres un type Voucher appelé Voucher et un List<Country> appelé Countries. Bon a une variable de type int appelé VoucherNumber

Ce modèle Voir passe dans une vue fortement défini Refund\Index

Je suis en train d'obtenir KO-mvc pour lier les valeurs Refund.Voucher.VoucherNumber à une zone de texte, et les valeurs dans Refund.Countries dans une liste déroulante. Sur le contrôleur, j'ai codé en dur les valeurs de Voucher.Vouchernumber et ajouté deux pays à la liste Country.

Voici mon code Voir:

@using Resources 
@using PerpetuumSoft.Knockout 
@model MVC.Models.RefundViewModel 
@{ 
    var ko = Html.CreateKnockoutContext(); 
} 

<div id="refundformcontainer"> 
    <div id="headersection"> 
     <div id="pagetitlecontainer">@Language.RefundVouchers</div> 
     <div id="helpercontainer"> 
      <label id="lblhelper">To begin enter a voucher number or scan a barcode</label> 
     </div> 
    </div> 

    <div id="vouchercontainer"> 
     <div id="voucherdetailscontainer"> 
      <h5>@Language.VoucherDetails</h5> 
      <div id="vouchernumbercontainer" class="initialvoucherfield"> 
       @Html.LabelFor(x=>x.Voucher.VoucherNumber) 
       @ko.Html.TextBox(x=>x.Voucher.VoucherNumber) 
      </div> 
      <div id="countrycontainer" class="initialvoucherfield"> 
       @Html.LabelFor(x=>x.Voucher.Country) 
       <select ko.Bind.Options(x=>x.Countries).OptionsText("Name").OptionsValue("CountryId").Value(x=>x.Voucher.CountryId) ></select> 
      </div> 
     </div> 
    </div> 
</div> 
@ko.Apply(Model); 

Lorsque la page se charge, ni les contrôles sont liés à.

Quand je regarde la source généré le code suivant est généré

<script type="text/javascript"> 
    var viewModelJs = {"Refund":null,"Voucher":{"VoucherId":0,"VoucherNumber":123456789,"Country":null,"CountryId":0,"Retailer":null,"RetailerId":0,"PurchaseDate":"0001-01-01T00:00:00","CustomsStampDate":null,"InvoiceNumber":"","LineItems":[],"TotalPurchasePrice":0.0},"Countries":[{"CountryId":380,"Name":"Italy"},{"CountryId":724,"Name":"Spain"}]}; 
    var viewModel = ko.mapping.fromJS(viewModelJs); 
    ko.applyBindings(viewModel); 
</script> 

knock-out-2.2.0.js et knockout.mapping-latest.js sont tous deux inclus dans la page

L'erreur Je reçois est

0x800a139e - JavaScript runtine error: Unable to parse bindings 
Message: [Object Error] 
Bindings value: Voucher().VoucherNumber 

J'ai alors changé le modèle de remboursement View il avait une propriété VoucherNumber et avait la référence textbox ce lieu de la propriété Voucher.VoucherNumber

@ko.Html.TextBox(x=>x.VoucherNumber) 

Quand je courais ce que j'ai eu le même incapable d'analyser l'erreur de liaisons, mais cette fois pour le pays

Bindings value: options : Countries, optonsText : Name, optionsValue : CountryId 

Est-ce que quelqu'un a une idée de ce qui est la cause?

+3

knock-out-mvc dispose actuellement d'un bug de sorte que les propriétés imbriquées ('x.Voucher.VoucherNumber' par exemple) ne sont pas correctement wroking voir ce double? question pour une solution de contournement: http://stackoverflow.com/questions/17918628/bind-data-with-nested-object-using-knockout-mvc-in-mvc-4 – nemesv

+0

Merci, c'est un assez mauvais bug! Votre lien m'a conduit à lire un peu plus et trouver ce http://stackoverflow.com/questions/11618042/is-there-a-reason-i-would-use-knockout-mvc-instead-of-knockout- js - pas si sûr que je vais l'utiliser maintenant! – Neil

+1

Je ne vois pas knockout-mvc aussi mauvais que Tyrsius dans la question liée, il a quelques problèmes et limitations, mais en le comparant aux webforms est trop fort. Si vous connaissez knock-out et de toute façon en utilisant ASP.NET MVC et vous aimez avoir des vues typées storngly et kncockout expressions de liaison de données et vous savez ce que vous faites alors ce n'est pas si mal. – nemesv

Répondre

0

Je pense que cela devrait fonctionner.

<select @ko.Bind.Options(x=>x.Countries).OptionsText("'Name'").OptionsValue("'CountryId'").Value(x=>x.Voucher.CountryId) ></select> 
Questions connexes