如何使用流畅的语法创建强类型的HtmlHelper?

时间:2017-05-11 04:05:15

标签: asp.net asp.net-mvc asp.net-mvc-4 razor html-helper

我正在尝试使用流畅的语法创建强类型的HTML帮助器。我在网上看到了一些例子,但他们都使用TagBuilder来构建html。相反,我想在CurrencyTextBox类中存储对原始HTML帮助器对象的引用,以便以后访问(因为它包含大量有用的信息,我也可以使用其TextBoxFor方法创建一个文本框)。

以下代码无效。

扩展方法

public static class CurrencyTextBoxHelper
{
    public static CurrencyTextBox<TModel, TValue> CurrencyFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {
        return new CurrencyTextBox<TModel, TValue>(helper, expression);
    }
}

CurrentTextBox类

public class CurrencyTextBox<TModel, TValue>: IHtmlString
{
    private RouteValueDictionary _attr = null;
    private HtmlHelper<TModel> _helper;
    private Expression<Func<TModel, TValue>> _expression;

    public CurrencyTextBox(HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {
        _helper = helper;
        _expression = expression;
        _attr = new RouteValueDictionary();
    }

    public CurrencyTextBox<TModel, TValue> AddClass(string class)
    {
       _attr.Add("class",class);
        return this;
    }

    public CurrencyTextBox<TModel, TValue> Enabled(bool enabled)
    {
        if (!enabled)
        {
            _attr.Add("disabled", "disabled");
        }
        return this;
    }
    public string ToHtmlString()
    {
        return ToString();
    }

    public override string ToString()
    {
        // i get error at line below

        var textBox = _helper.TextBoxFor(_expression, ModelMetadata.FromLambdaExpression(_expression, _helper.ViewData).EditFormatString, _attr);

        return textBox.Tostring();
    }
}

但是在上面的代码中,ToString()方法内部出现错误

  

严重级代码描述项目文件行抑制状态   错误CS1061&#39; HtmlHelper&#39;不包含的定义   &#39; TextBoxFor&#39;没有扩展方法&#39; TextBoxFor&#39;接受第一个   类型&#39; HtmlHelper&#39;的论点可以找到(你错过了吗?   using指令或程序集引用?)

也可以在costructor中传递htmlhelper和expression吗?

3 个答案:

答案 0 :(得分:0)

将您的Tostring() ToHtmlString()方法中的override更改为ToString()

示例:

public override string ToString()
{

    var textBox = _helper.TextBoxFor(_expression, ModelMetadata.FromLambdaExpression(_expression, _helper.ViewData).EditFormatString, _attr);

    return textBox.ToHtmlString();
}

并更改AddClass方法,如下所示:

  public CurrencyTextBox<TModel, TValue> AddClass(string className)
    {
       _attr.Add("class",className);
        return this;
    }

希望对你有帮助。

答案 1 :(得分:0)

首先,您需要使用正确的语法。

 public CurrencyTextBox<TModel, TValue> AddClass(string class)

是保留关键字。您需要将其重命名为 className

return textBox.Tostring();

C#区分大小写。所以你需要使用返回textBox.ToString();

答案 2 :(得分:0)

这是我自己的愚蠢错误

INSTALL_REFERRER方法位于TextBoxFor命名空间中。所以在添加System.Web.Mvc.Html;后修复它。