2012-12-10 5 views
18

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?

+0

@ steven-Sanderson Sie sollten Steve, dies zu betrachten bekommen, wie er Mitglied ist :) – MikeD

Antwort

1

Ich bin nicht ähnlich mit diesem Helfer, aber für die Sammlung mache ich ein bisschen anders Trick.

definieren Schlüssel

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

var index = 0;

dann bauen Form

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

Auf Steuerungsseite Aktion erstellen mit dem Eingangsparameter

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