net mvc frombody asp c# asp.net-mvc asp.net-mvc-4 model-binding

c# - mvc - ModelBinding con Steve Sandersons BeginCollectionItem



razor c# (1)

Estoy usando la extensión BeginCollectionItem Steve Sanderson para ayudar a enlazar listas de artículos. Esto funciona bien para los tipos primitivos. El problema que tengo es que para un cuaderno de modelos personalizado que he escrito no puedo ver cómo generar el nombre completo y el índice del elemento al que estoy enlazando.

Actualmente mi modelo de carpeta se ve así:

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

A mi ViewModel Lokks le gusta esto (algunas propiedades se omiten para mayor claridad):

public class EditFeeEarningCapacityViewModel { public List<FeeEarner> FeeEarners { get; set; } public class FeeEarner { public Money AverageChargeOutRate { get; set; } } }

Mi plantilla de edición para el tipo de dinero se ve así:

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

Para un formulario que tiene valores de publicación como este:

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

No puedo ver cómo detectar el índice del elemento o el nombre de la propiedad al que estoy enlazando. Básicamente, ¿cómo puedo encontrar el índice del elemento al que estoy tratando de enlazar y el nombre de la propiedad de la que estoy tratando de enlazar los datos?


No estoy familiarizado con ese ayudante, pero para la colección estoy haciendo un truco un poco diferente.

definir clave

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

índice var = 0;

luego construir la forma

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

En el lado del controlador crear acción con parámetro de entrada

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