2012-12-10 14 views
18

Używam rozszerzenia Steve Sandersons BeginCollectionItem, aby pomóc w wiązaniu list elementów. Działa to dobrze w przypadku typów pierwotnych. Problem, który mam, polega na tym, że dla niestandardowego spoiwa modelowego, który napisałem, nie widzę sposobu wygenerowania pełnej nazwy i indeksu elementu, do którego się zobowiązuję.Modelowanie ze Steve Sandersons BeginCollectionItem

Obecnie mój model spoiwo wygląda następująco:

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); 
     } 
    } 
} 

My ViewModel Lokks tak (niektóre propertis pominięte dla jasności):

public class EditFeeEarningCapacityViewModel 
{ 

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

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

Mój Edit Template for typ Pieniądze wygląda następująco:

@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) 

Dla formularza, który ma takie wartości postu:

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 

Nie widzę sposobu wykrycia indeksu przedmiotu lub nazwy nieruchomości, do której się zobowiązuję. Zasadniczo, jak znaleźć indeks elementu, który próbuję powiązać, i nazwę właściwości, z której próbuję powiązać dane?

+0

@ Stevensa-Sanderson powinien dostać Steve patrzeć na to, jak jest on członkiem :) – MikeD

Odpowiedz

1

Nie jestem fimilar z tym pomocnikiem, ale dla kolekcji robię trochę inną sztuczkę.

określenie klucza

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

var wskaźnik = 0;

następnie zbudować postać

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

Na stronie Controller utworzyć akcję z parametrem wejściowym

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