【问题标题】:Asp.Net Form Input With Comma带逗号的 Asp.Net 表单输入
【发布时间】:2017-04-14 20:06:51
【问题描述】:

我有一个表格,其中包含一个收集美元金额的输入(例如:$5,000

如何允许 $5,000 的输入不触发 (!ModelState.IsValid) 删除逗号 (,) 和 $ 进行 POST?

视图模型

public class FormViewModel
{
    [Required, RegularExpression("[0-9,]")]
    public int? Amount { get; set; }
}

查看

<form>
  <input asp-for="Amount" />
  <span asp-validation-for="Amount"></span>
  <button type="submit">Submit</button>
</form>

控制器

[HttpPost]
public IActionResult PostForm(FormViewModel viewModel)
{
  if (!ModelState.IsValid)
  {
    return View(viewModel)
  }
  else
  {
  //Post Form
  }
}

【问题讨论】:

  • 您可以制作 HTML 辅助方法以根据此条件从输入中提取您想要的任何内容
  • 在属性上使用[DataType(DataType.Currency)] 属性

标签: c# asp.net forms asp.net-core asp.net-core-mvc


【解决方案1】:

我将更改视图模型以接受字符串而不是 int?Amount 属性:

public class FormViewModel {
    public string Amount { get; set; }

    public int? Value {
        get {
            int result = 0;
            if (Int32.TryParse(Amount, NumberStyles.Currency, CultureInfo.CurrentCulture, result) {
                return result;
            }
            return null;
        }
    }
}

现在用户输入存储在Amount 属性中,而解析的整数值存储在Value 属性中。

【讨论】:

  • 这行得通,但我该如何扭转呢?所以我可以发布,但我将如何获取该值并放回表单中?
【解决方案2】:

你试过 IModelBinder 了吗?

public class DecimalModelBinder: System.Web.Mvc.IModelBinder
{
    public object BindModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        if (valueResult.AttemptedValue != string.Empty)
        {
            try
            {
                string attemptedVal = valueResult.AttemptedValue?.Replace(",", ".").Replace("$", "");
                actualValue = Convert.ToDecimal(attemptedVal, new CultureInfo("en-US"));
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }
        }
        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

error with decimal in mvc3 - the value is not valid for field的答案不同但相似

【讨论】:

    【解决方案3】:

    更新模型以使用数据类型注释。

    public class FormViewModel {
        [DataType(DataType.Currency)]
        [Required]
        public int? Amount { get; set; }
    }
    

    如果您想包含美分,则将属性更改为小数

    public class FormViewModel {
        [DataType(DataType.Currency)]
        [Required]
        public decimal? Amount { get; set; }
    }
    

    【讨论】:

      【解决方案4】:

      我最终使用 AutoMapper 来回映射属性。

      我将 ViewModel 更改为字符串,然后使用如下自动映射器:

      //Map From Int To String
      CreateMap<Models.ServiceModel, FormViewModel>().ForMember(dest => dest.Amount, opt => opt.MapFrom(src => src.Amount.ToString()));
      
      
      //Map From String Back To Int
      CreateMap<FormViewModel, Models.ServiceModel>().ForMember(dest => dest.Amount, opt => opt.MapFrom(src => int.Parse(src.Amount.Replace(",", ""))));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 2020-12-23
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        相关资源
        最近更新 更多