在编辑期间和编辑时将EditorFor()字段格式化为货币?

时间:2015-02-18 17:14:46

标签: asp.net-mvc twitter-bootstrap asp.net-mvc-5 currency-formatting editorformodel

我的视图EditorFor()上有一个[cost]

<div class="form-group">
        @*@Html.LabelFor(model => model.cost, htmlAttributes: new { @class = "control-label col-md-2" })*@
        <span class="control-label col-md-2">Cost:</span>
        <div class="col-md-10">
            @Html.EditorFor(model => model.cost, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.cost, "", new { @class = "text-danger" })
        </div>
    </div>

我想做的是在查看时使用$显示此值(单个记录,网格内等),并在用户向字段输入值时进行格式化。例如,在输入12345时,我希望在用户输入时自动显示为12,345的值。

有没有一种简单的方法可以做到这一点?

我正在使用MVC5 Code-First和Bootstrap,在我的研究中,我发现了MVC3 / 4的几种可能选项,但是大多数选项看起来很麻烦。


修改

我正在寻找一种方法,在我的currencyEditorFor()https://gridmvc.codeplex.com)列中显示Grid.Mvc字段{{1} }}:

[cost]

我在模型中将@try { @Html.Grid(Model).Columns(columns => { columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="/INV_Assets/Edit/@o.Id" class="btn btn-primary btn-sm noDecoration"><span class="glyphicon glyphicon-pencil"></span> @*Edit*@</a>).SetWidth(15); columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="/INV_Assets/Delete/@o.Id" class="btn btn-danger btn-sm noDecoration"><span class="glyphicon glyphicon-remove-circle"></span> @*Delete*@</a>).SetWidth(15); columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="/INV_Assets/Details/@o.Id" class="btn btn-default btn-sm noDecoration"><span class="glyphicon glyphicon-eye-open"></span> @*View*@</a>).SetWidth(15); columns.Add(o => o.Status.status_description).Titled("Status").RenderValueAs(o => o.Status.status_description).Sanitized(false).Encoded(false).Sortable(true).Filterable(true).SetWidth(20); columns.Add(o => o.Location.location_dept).Titled("Dept").RenderValueAs(o => o.Location.location_dept).SetWidth(20); columns.Add(o => o.Location.location_room).Titled("Room").RenderValueAs(o => o.Location.location_room).SetWidth(20); columns.Add(o => o.owner).Titled("Owner").RenderValueAs(o => o.owner).SetWidth(20); columns.Add(o => o.Type.type_description).Titled("Type").RenderValueAs(o => o.Type.type_description).SetWidth(20); columns.Add(o => o.Manufacturer.manufacturer_description).Titled("Manufacturer").RenderValueAs(o => o.Manufacturer.manufacturer_description).SetWidth(20); columns.Add(o => o.Model.model_description).Titled("Model").RenderValueAs(o => o.Model.model_description).SetWidth(20); columns.Add(o => o.Vendor.vendor_name).Titled("Vendor").RenderValueAs(o => o.Vendor.vendor_name).SetWidth(20); columns.Add(o => o.description).Titled("Desc").RenderValueAs(o => o.description).SetWidth(20); columns.Add(o => o.asset_tag_number).Titled("Asset Tag #").RenderValueAs(o => o.asset_tag_number).SetWidth(20); columns.Add(o => o.serial_number).Titled("Serial #").RenderValueAs(o => o.serial_number).SetWidth(20); columns.Add(o => o.ip_address).Titled("IP Addr").RenderValueAs(o => o.ip_address).SetWidth(20); columns.Add(o => o.mac_address).Titled("Mac Addr").RenderValueAs(o => o.mac_address).SetWidth(20); columns.Add(o => o.po_number).Titled("PO #").RenderValueAs(o => o.po_number).SetWidth(20); columns.Add(o => o.invoice_number).Titled("Inv. #").RenderValueAs(o => Convert.ToString(o.invoice_number)).SetWidth(20); columns.Add(o => o.cost).Titled("Cost").RenderValueAs(o => "$" + Convert.ToString(o.cost)).SetWidth(20); columns.Add(o => o.note).Titled("Note").RenderValueAs(o => o.note).SetWidth(20); columns.Add(o => o.acquired_date).Titled("Acq. Date").RenderValueAs(o => Convert.ToString(o.acquired_date)).SetWidth(20); columns.Add(o => o.disposed_date).Titled("Disp. Date").RenderValueAs(o => Convert.ToString(o.disposed_date)).SetWidth(20); columns.Add(o => o.created_date).Titled("Crtd. Date").RenderValueAs(o => Convert.ToString(o.created_date)).SetWidth(20); columns.Add(o => o.created_by).Titled("By").RenderValueAs(o => o.created_by).SetWidth(20); columns.Add(o => o.modified_date).Titled("Mod. Date").RenderValueAs(o => Convert.ToString(o.modified_date)).SetWidth(20); columns.Add(o => o.modified_by).Titled("By").RenderValueAs(o => o.modified_by).SetWidth(20); }).WithPaging(10).Sortable().Filterable().WithMultipleFilters(); } catch (NullReferenceException ex) { return; } 定义为[cost],但网格要求值为decimal。我认为这string使Convert.ToString()上的注释[DataType(DataType.Currency)][DisplayFormat(DataFormatString="{0:C}", ApplyFormatInEditMode=true)]生效?

public decimal cost { get; set; }

理想情况下,希望始终将 [DataType(DataType.Currency)] [DisplayFormat(DataFormatString="{0:C}", ApplyFormatInEditMode=true)] public decimal cost { get; set; } 1222345.47显示为$1,222,345.47,让用户以简单小数形式输入值,并在点击EditorFor()时可视化格式为currency格式的值。

有人可以提供一种解决方法吗?


EDIT2

我使用下面的自定义格式字符串正确显示了值EditorFor()

[DisplayFormat(DataFormatString = "{0:#,###0.00}", ApplyFormatInEditMode=true)]

正如克里斯所提到的,我必须删除“,”以便模型接受该值为有效 - 我相信我可以在表单尝试发布时执行。

仍然试图找出如何以MVCGrid格式显示currency中的值。

2 个答案:

答案 0 :(得分:1)

这是一个双管齐下的答案。就查看数据而言,您可以使用以下命令简单地装饰您的财产:

[DisplayFormat(DataFormatString = "{0:C}")]
public Decimal cost { get; set; }

或者

[DataType(DataType.Currency)]
public Decimal cost { get; set; }

同样可行。

然而,对于编辑值,事情有点复杂。 DisplayFormat除了名为DataFormatString的{​​{1}}之外还会使用参数。将其设置为ApplyInEditMode,将使Razor呈现的值也采用所选格式。但是,在你跑掉并做到这一点之前,这里的问题是像#34; $ 1,234.56&#34;这样的贴值不会被模型绑定器作为十进制值处理。< / p>

对于这个以及您想要的格式化类型功能,您应该只使用JavaScript。有一公吨的JavaScript插件可以格式化输入值。只是谷歌类似&#34; javascript格式输入值&#34;你应该得到比你更关心的结果。找一个适合你的方法并使用它。

答案 1 :(得分:1)

我认为你问题的编辑部分得到了很好的回答。

Grid MVC允许您使用.Format()选项格式化小数,如下所示:

columns.Add(model => model.Cost).Titled("Cost PA").Format("£{0:#,###0.00}").SetWidth(10); columns.Add(model => model.CoTermDays).Titled("Days").SetWidth(10);

结果如下: currency format in grid