我有自定义类型Money的模型绑定器.绑定器工作正常,但内置的绑定/验证正在进行,并将数据标记为无效.
我的活页夹看起来像这样:
public class MoneyModelBinder : DefaultModelBinder { protected override void OnModelUpdated(ControllerContext controllerContext,ModelBindingContext bindingContext) { var money = (Money)bindingContext.Model; var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Amount").AttemptedValue; var currencyCode = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Iso3LetterCode").AttemptedValue; 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; } } }
当用户在文本框中键入类似“45,000”的值时,我的绑定器会正确地获取值,解析它并将其设置到模型中.
我遇到的问题是,默认验证然后启动状态值’45,000’对于Amount无效,因为它是十进制类型有意义,但我已经绑定了数据.如何防止我已经处理过的默认绑定器绑定数据?
我不确定这是否有任何区别,但我正在使用Html.EditorFor和编辑器,如下所示:
@model Money <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:n0}",Model.Amount) }) @Html.HiddenFor(x => x.Iso3LetterCode) </div>