HtmlHelper 扩展改变传入的属性的值

Posted

技术标签:

【中文标题】HtmlHelper 扩展改变传入的属性的值【英文标题】:HtmlHelper extension alter the value of the property passed in 【发布时间】:2013-03-31 01:20:41 【问题描述】:

我有一个 html 助手,可以友好地显示文本框的电话号码。用法:

Html.PhoneNumberFor(m => m.PhoneNumber)

我希望它采用像“1111111111”这样的数字并输出“(111)111-1111”。我已经尝试通过从 html 助手扩展方法中的表达式中获取属性来更新 html 助手的视图数据,但这似乎不起作用。那么,有人知道如何更新表达式对象中的属性值吗?这是不起作用的代码:

public static MvcHtmlString PhoneNumberFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, string>> expression, object htmlAttributes)
    
        var value = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model as string;

        if (!string.IsNullOrEmpty(value) && value.Length == 10)
        
            value = string.Format("(0)1-2", value.Substring(0, 3), value.Substring(3, 3), value.Substring(6));                

            var fieldName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
            helper.ViewData[fieldName] = value;

        

        return helper.TextBoxFor(expression, htmlAttributes);           
    

【问题讨论】:

例如更改您拥有value.SubString(0,3) 的代码并创建一个名为areacode 的局部变量,然后对其他2 个SubStringValues 执行相同操作,并将它们作为参数传递给您的string.Format 方法 单步执行时,“value”变量具有正确的值。你的可能更具可读性,但我不确定它会如何解决我的问题.. 你不能这样做int valuePhone = 1111111111; var valuePhoneFrmt = string.Format("0:(###)###-####", valuePhone); 就像我说的那样,这仍然无法解决文本框中的值没有被我在视图数据字典中设置的值更新的问题 helper.ViewData[fieldName] = value;。我还必须强制转换为不受欢迎的整数。 【参考方案1】:

我会为此创建一个自定义 DisplayFormatAttribute,然后您只需将其应用于 PhoneNumber 属性。

【讨论】:

感谢您的评论,但实际上我还需要在该助手中做一些其他的事情。另外,我必须去更改各种视图模型,这比更改视图更耗时。【参考方案2】:

如果不是,这对你有用吗?请解释你需要什么才能让它工作..

如果您想坚持使用字符串值作为输入,这应该可以工作

var formattedPhone = 
    String.Format("0:(###)###-####", Convert.ToInt64("1111111111"));

【讨论】:

不。 helper.ViewData[fieldName] = formattedStr 存在一些问题。它实际上并没有像我需要的那样更新模型。 是不是因为预期被格式化的值需要是Int32 值..? 我相信string.Format expects to return a string but it's formatted value needs to be an Int` 我尝试了我在上面评论部分留下的代码作为一个不会格式化的字符串,但我想知道IFormatProvider是否是预期的......无论哪种方式。 . 注释代码有效,但我仍然对您遇到的问题感到困惑 你可以这样做以使其工作String.Format("0:(###)###-####", Convert.ToInt64("1111111111")); 与字符串格式无关。这很好用。事实上,我正在更新 ViewData 字典,但它似乎并没有真正使用新值进行更新。

以上是关于HtmlHelper 扩展改变传入的属性的值的主要内容,如果未能解决你的问题,请参考以下文章

从 lambda 表达式访问属性的 HtmlHelper 方法之间的区别

在 ASP.net core mvc 3.1 中的 HtmlHelper 扩展方法中使用 DataAnnotation 本地化器

创建另一种类型的 htmlhelper 实例

mvc 扩展htmlhelper

查找HTMLHelper,URLHelper和AJAXHelper类型的所有扩展方法

HtmlHelper总结