MVC3 TextBoxFor与EditorFor - 每个问题

时间:2012-05-29 20:27:33

标签: asp.net-mvc asp.net-mvc-3 razor html-helper modelattribute

我已经浏览了一段时间的网络,但无法找到解决我具体问题的好方法。我正在研究MVC3 Razor应用程序。我在客户端使用jQuery做了很多东西,所以在这种情况下我需要输入字段才能拥有html Id属性。

在此特定问题中,当我使用TextBoxFor显示货币(类型为十进制)时,该值呈现4位小数(我只想要2)。我输入了模型属性

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

当它呈现时,似乎忽略了这个“displayFormat”。我在网上看到其他帖子确认TextBoxFor html助手存在这个问题。

另一方面,我可以更改为使用EditorFor html帮助程序,并且DisplayFormat模型属性适用于将文本框值格式化为2位小数。缺点是我没有能力将html属性应用到我需要jQuery的html帮助器。什么是两全其美的最好方法?我已经看到了一些变通方法,但似乎必须有一种更简单的方法来实现这一点。

作为旁注,我的特定项目要求我的大多数字段都有html Id属性,有时还有类,所以我可以执行客户端jQuery操作。不确定这是否意味着我应该专注于扩展EditorFor html帮助器以便也接受html属性。

3 个答案:

答案 0 :(得分:2)

DisplayFormat仅供MVC用于razor的任何Display扩展方法。 (例如DisplayFor)不幸的是,为了做你想做的事,你必须用手写一些""代码......这是一个让你前进的例子。它基本上重现了TextBoxFor代码,但做出了一些很可能对生产不利的假设。请注意以下displayText的分配,这是我们真正关心您在DisplayFormatString中设置的DisplayFormat的位置。

在您的观看@Html.TextEditorFor(m => m.Value)

中调用它
public static class CustomEditorFor
{
    public static IHtmlString TextEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return TextEditorFor(helper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    public static IHtmlString TextEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
        object value = metadata.Model;
        string displayText = string.Format(metadata.DisplayFormatString, value);

        string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));

        TagBuilder tagBuilder = new TagBuilder("input");
        tagBuilder.MergeAttributes(htmlAttributes);
        tagBuilder.MergeAttribute("type", "text");
        tagBuilder.MergeAttribute("name", fullName, true);

        tagBuilder.MergeAttribute("value", displayText);
        tagBuilder.GenerateId(fullName);
        ModelState modelState;
        if (helper.ViewData.ModelState.TryGetValue(fullName, out modelState))
        {
            if (modelState.Errors.Count > 0)
            {
                tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
            }
        }

        tagBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata));

        return new HtmlString(tagBuilder.ToString(TagRenderMode.SelfClosing));

    }
}

答案 1 :(得分:0)

这里的简单解决方案是为您的自定义货币类型创建自定义显示和编辑器模板。这样做。

public class MyModel {
    [DataType(DataType.Currency)]
    public decimal mycurrency {get;set;}
}

然后在〜/ Views / Shared / EditorTemplates / Currency.cshtml(或DisplayTemplates)

@model decimal?

@Html.TextBox("", string.Format("{0:0.00}", Model), new { whateveryourattributes="attributevalues"})

然后你可以使用DisplayFor或EditorFor等等。

答案 2 :(得分:0)

我最终使用了Telerik的Numeric Textbox控件。我确信上述两个答案都会修复小数格式。

我仍然需要回顾模型验证。我在使用EditorFor html帮助程序时遇到问题,拉动验证模型上的数据注释以进行验证,而对TextBoxFor执行相同的操作却没有。但与此同时,EditorFor帮助器的缺点是不接受我需要的jQuery的HtmlAttributes。

我已经开始使用MVC4 RC,所以我希望在版本4中修复了很多这些问题。