Ich benutze Steve Sandersons BeginCollectionItem
Erweiterung, um mit verbindlichen Listen von Elementen zu helfen. Dies funktioniert gut für primitive Typen. Das Problem, das ich habe, ist, dass ich für einen benutzerdefinierten Modellordner, den ich geschrieben habe, nicht sehen kann, wie ich den vollständigen Namen und den Index des Elements, an das ich gebunden bin, erzeuge.ModelBinding mit Steve Sandersons BeginCollectionItem
Derzeit sieht mein Modell Bindemittel wie folgt aus:
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);
}
}
}
Meine Viewmodel Lokks wie folgt aus (einige propertis der Übersichtlichkeit halber weggelassen):
public class EditFeeEarningCapacityViewModel
{
public List<FeeEarner> FeeEarners { get; set; }
public class FeeEarner
{
public Money AverageChargeOutRate { get; set; }
}
}
Meine Vorlage bearbeiten für die Geld-Typ wie folgt aussieht:
@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)
Für eine Form, die Post-Werte wie folgt hat:
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
Ich kann nicht sehen, wie man den Index des Artikels oder des Eigenschaftsnamens, an den ich gebunden bin, erkennt. Also, wie finde ich den Index des Objekts, an das ich zu binden versuche, und den Namen der Eigenschaft, von der ich versuche, die Daten zu binden?
@ steven-Sanderson Sie sollten Steve, dies zu betrachten bekommen, wie er Mitglied ist :) – MikeD