我有一个类:
public class Item
{
public int ItemID { get; set; }
[Display(Name = "Value")]
[Column(TypeName = "money")]
public decimal Value{ get; set; }
}
在我输入12.50的表单中,在我的帖子Action中,对象有Item.Value = 1250,应该有12.50,如何解决这个问题?
行动方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Item item)
{
...code...
}
查看:
<div class="editor-label">
@Html.LabelFor(model => model.Value)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Value)
@Html.ValidationMessageFor(model => model.Value)
</div>
当输入12时,验证客户端会说'字段Valor必须是数字'。但是让我执行post action方法,用12,说同样的话,但不要让我。
答案 0 :(得分:2)
我用自定义绑定解决了感谢Phil Haack(http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx)。我将DecimalModelBind类修改为:
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try
{
var value = valueResult.AttemptedValue.Replace('.', ',');
actualValue = Convert.ToDecimal(value,
CultureInfo.CurrentCulture);
}
catch (FormatException e)
{
modelState.Errors.Add(e);
}
if (bindingContext.ModelState[bindingContext.ModelName] == null)
{
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
}
return actualValue;
}
}
我添加了这些内容:
var value = valueResult.AttemptedValue.Replace('.', ',');
if (bindingContext.ModelState[bindingContext.ModelName] == null)
第一个将','替换为'。'第二个检查是否没有具有相同名称的ModelState以避免异常。
答案 1 :(得分:0)
尝试在服务器上指定将使用.
作为小数分隔符的文化,例如:
<globalization uiCulture="en-US" culture="en-US" />
或者,如果您想使用auto
文化(即从客户端浏览器设置和Accept-Language
请求标头推断),那么您可以为小数类型编写自定义模型绑定器并使用{{ 1}}属性以显式设置所需的格式。我在下面的帖子中说明了这一点:https://stackoverflow.com/a/11272982/29407(这是DateTime类型,但你也可以轻松地调整[DisplayFormat]
类型的示例)