2017-04-14 40 views
1

我有收集美元金额的输入形式(例如:$5,000Asp.Net表单输入逗号

我怎么能允许$5,000输入到不触发(!ModelState.IsValid)删除逗号(,)和$用于发布?

视图模型

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 
    } 
} 
+0

可以使HTML辅助方法来提取不管你基于这个标准 –

+0

使用'[数据类型(数据类型输入想要的。货币)]属性 – Nkosi

回答

0

我结束了使用AutoMapper的属性映射来回。

我改变了我的视图模型为一个字符串,然后使用automapper象下面这样:

//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(",", "")))); 
0

我会改变视图模型接受一个字符串,而不是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属性中。

+0

''属性这个工程,但我会如何扭转这种情况?所以我可以发布,但我将如何获得该值并放回到表单中? – jpdesigning

0

你试过了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; 
    } 
} 

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

0

更新使用数据类型批注的模型。

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

如果你想包括美分,然后更改属性,以十进制

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