2017-04-14 41 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; } 
}