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?
@ steven-Sanderson Dovreste ottenere Steve a guardare a questo come egli è un membro :) – MikeD