加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-4 – 如何防止复杂类型的默认绑定器?

发布时间:2020-12-15 21:05:43 所属栏目:asp.Net 来源:网络整理
导读:我有自定义类型Money的模型绑定器.绑定器工作正常,但内置的绑定/验证正在进行,并将数据标记为无效. 我的活页夹看起来像这样: public class MoneyModelBinder : DefaultModelBinder { protected override void OnModelUpdated(ControllerContext controllerC
我有自定义类型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>

解决方法

您只需将Amount属性标记为只读:
[ReadOnly(true)]
public decimal? Amount { get; set; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读