使用自定义MVC扩展修改帖子数据?

时间:2010-03-30 02:49:19

标签: asp.net-mvc asp.net-mvc-2

所以我正在研究编写一些自定义MVC扩展,我试图解决的第一个是FormattedTextBox来处理诸如货币,日期和时间之类的事情。我有完美的渲染工作,格式化,使用强大的类型和一切都是金色的。但是,我现在遇到的问题是当页面发回数据时清理格式化的东西。

以货币格式为例。我们将这些例子用于美元。当对象具有十进制属性时,该值将为79.95。您的编辑视图类似于:

<%= Html.FormattedTextBox(model => Model.Person.HourlyWage, "{0:C}") %>

对于GET请求来说,这一切都很好,但是在POST时,值将是$79.95,当你分配给那个小数时,会很快地变得不快乐并最终推迟{{1}在那里。

所以我的问题是,在MVC框架进入并开始将其推回到我的ViewModel之前,如何让代码在某处工作以使用该值?我宁愿这是服务器端而不是客户端。

谢谢!

2 个答案:

答案 0 :(得分:1)

一种解决方案是编写一个custom model binder,它可以将绑定$79.95转换为模型中的十进制字段。另一种解决方案是在客户端进行。在jQuery form.submit处理程序中,您可以修改要发布的输入字段的值。

答案 1 :(得分:1)

您可以使用custom Model Binders将发布的数据推送到对象中。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(
    [ModelBinder(typeof(YourModelBinderAttribute))]YourClass obj)
{
  // your code here

  return View();
}

public class MessageModelBinderAttribute : IModelBinder
{
    #region IModelBinder Members

    public object BindModel(
        ControllerContext controllerContext, 
        ModelBindingContext bindingContext)
    {
        YourClass obj = new YourClass();

        ValueProviderResult result;
        if (bindingContext.ValueProvider.TryGetValue(
            "YourPostedInputName", out result))
        {
            obj.Price = result.AttemptedValue;
        }

        return message;
    }

    #endregion
}