2012-12-10 3 views
18

Sto usando l'estensione di Steve Sanderson BeginCollectionItem per aiutare con gli elenchi di elementi vincolanti. Questo funziona bene per i tipi primitivi. Il problema che sto riscontrando è che per un raccoglitore di modelli personalizzato che ho scritto non riesco a vedere come generare il nome completo e l'indice dell'articolo a cui sono vincolato.ModelBinding with Steve Sandersons BeginCollectionItem

Attualmente il mio modello di legante assomiglia a questo:

public class MoneyModelBinder : DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Amount"); 

     if (valueResult != null) 
     { 
      var value = valueResult.AttemptedValue; 
      var currencyCode = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Iso3LetterCode").AttemptedValue; 

      var money = (Money) bindingContext.Model; 

      Money parsedValue; 
      if (String.IsNullOrEmpty(value)) 
      { 
       money.Amount = null; 
       return; 
      } 

      var currency = Currency.FromIso3LetterCode(currencyCode); 

      if (!Money.TryParse(value, currency, out parsedValue)) 
      { 
       bindingContext.ModelState.AddModelError("Amount", string.Format("Unable to parse {0} as money", value)); 
      } 
      else 
      { 
       money.Amount = parsedValue.Amount; 
       money.Currency = parsedValue.Currency; 
      } 
     } 
     else 
     { 
      base.OnModelUpdated(controllerContext, bindingContext); 
     } 
    } 
} 

mio ViewModel Lokks come questo (alcuni propertis omesso per chiarezza):

public class EditFeeEarningCapacityViewModel 
{ 

    public List<FeeEarner> FeeEarners { get; set; } 

    public class FeeEarner 
    { 
     public Money AverageChargeOutRate { get; set; } 
    } 
} 

mio Modifica modello per il tipo di denaro si presenta così:

@model Core.Money 
@{ 
    int decimalPlaces; 
    if(!int.TryParse(string.Format("{0}", ViewData["DecimalPlaces"]), out decimalPlaces)) 
    { 
     decimalPlaces = 0; 
    } 
} 
<div class="input-prepend"> 
    <span class="add-on">@Model.Currency.Symbol</span>@Html.TextBoxFor(m => m.Amount, 
                   new 
                   { 
                    placeholder = string.Format("{0}", Model.Currency), 
                    @class = "input-mini", 
                    Value = String.Format("{0:n" + decimalPlaces + "}", Model.Amount) 
                   }) 
</div> 
@Html.HiddenFor(x => x.Iso3LetterCode) 

Per una forma che ha valori post come questo:

FeeEarners.index 3fa91d09-0617-4bea-ae3f-d84862be8c04 

FeeEarners[3fa91d09-0617-4bea-ae3f-d84862be8c04].feeEarner.AverageChargeOutRate.Amount 500 
FeeEarners[3fa91d09-0617-4bea-ae3f-d84862be8c04].feeEarner.AverageChargeOutRate.Iso3LetterCode GBP 

non riesco a vedere come rilevare l'indice della voce o il nome della proprietà che sto legame. Quindi, in sostanza, come faccio a trovare l'indice dell'articolo che sto cercando di associare e il nome della proprietà che sto cercando di associare i dati?

+0

@ steven-Sanderson Dovreste ottenere Steve a guardare a questo come egli è un membro :) – MikeD

risposta

1

Non sono fimilarle con quell'Help ma per la raccolta sto facendo un trucco un po 'diverso.

definiscono chiave

var key = "EditModel[{0}].{1}"; 

var index = 0;

poi costruire forma

foreach(var fee in Model.FeeEarners){ 
    @Html.TextBox(string.Format(key, index, "PropertyNameFromYourFeeClass")); 
//It will build text box and set value 
} 

su lato controllore creare l'azione con il parametro di ingresso

public ActionResult Save(EditFeeEarningCapacityViewModel editModel){ 
...your code here 
}