MVC模型绑定+格式化

时间:2011-03-02 15:29:02

标签: c# asp.net-mvc validation asp.net-mvc-3 model-binding

我的MVC应用程序中有一个模型(Northwind),它有一个名为UnitPrice的属性:

public class Product { 
    public decimal UnitPrice { get; set; }
}

在我看来,我希望将其显示为货币{0:C}。我尝试使用DataAnnotations DisplayFormatAttribute:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.aspx

它适用于显示目的,但是当我尝试POST时它阻止我提交,因为它的格式不正确。如果我删除$那么它将允许我。

在尝试验证时,有什么方法可以忽略格式吗?

2 个答案:

答案 0 :(得分:4)

您可以为Product类型编写自定义模型绑定器并手动解析该值。以下是您可以继续的方式:

型号:

public class Product
{
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:C}")]
    public decimal UnitPrice { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new Product { UnitPrice = 10.56m });
    }

    [HttpPost]
    public ActionResult Index(Product product)
    {
        if (!ModelState.IsValid)
        {
            return View(product);
        }
        // TODO: the model is valid => do something with it
        return Content("Thank you for purchasing", "text/plain");
    }
}

查看:

@model AppName.Models.Product
@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.UnitPrice)
    @Html.EditorFor(x => x.UnitPrice)
    @Html.ValidationMessageFor(x => x.UnitPrice)
    <input type="submit" value="OK!" />
}

Model Binder(这里是神奇的地方):

public class ProductModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var price = bindingContext.ValueProvider.GetValue("unitprice");
        if (price != null)
        {
            decimal p;
            if (decimal.TryParse(price.AttemptedValue, NumberStyles.Currency, null, out p))
            {
                return new Product
                {
                    UnitPrice = p
                };
            }
            else
            {
                // The user didn't type a correct price => insult him
                bindingContext.ModelState.AddModelError("UnitPrice", "Invalid price");
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

Application_Start注册模型装订器:

ModelBinders.Binders.Add(typeof(Product), new ProductModelBinder());

答案 1 :(得分:0)

如果您希望格式化仅适用于显示,则将ApplyFormatInEditMode设置为false。