如何在帮助器中使用TextBoxFor?

时间:2014-04-18 12:20:52

标签: c# asp.net-mvc razor

我在razor页面中使用此代码。

  @{ var countryCode = Model.CountryCode;}
                @if (countryCode.Equals("CA") || countryCode.Equals("US"))
                {
                    @Html.DropDownListFor(m => m.ProvState, Model.Provinces)
                }
                else
                {
                    @Html.TextBoxFor(m => m.ProvState, Model.ProvState);
                }

我在LocatioHelper.cshtml中写了这个助手

@helper RenderProvince(LocationModel model)
{
    var countryCode = model.CountryCode;
    if (countryCode.Equals("CA") || countryCode.Equals("US"))
    {
    @Html.DropDownListFor(model.ProvState, model.Provinces)
    }
    else
    {
    @Html.TextBoxFor(model.ProvState, model.ProvState);
    }
}

我有错误,我必须明确指定dropDownListFor和TextBoxFor的类型,但在视图中我没有指定类型。

如何将其转变为助手?

2 个答案:

答案 0 :(得分:0)

根据我的观点,您可以将自定义帮助器方法打包到静态类中,并将您的方法声明为HtmlHelper<T>.上的简单扩展方法

public static class CustomHelper
{
 public static MvcHtmlString YourCustomHelper<TModel, TValue> (
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TValue>> expression ---- )
    {
        //Write your custom logic here.
    }
}

您可以在视图中导入此类,并使用@Html.YourCustomHelper()的通常语法

使用此辅助方法

希望这有帮助。

修改 如果您使用内联辅助方法,请仅在您的View中将辅助方法保留在使用它的位置。否则,请尝试创建一个外部html帮助方法,如上所示。

答案 1 :(得分:0)

不,这是不可能的。您可以使用helper编写普通HTML @Html.TextBoxFor,因为您的视图是强类型的。 所以你需要这样的东西:

public class HelperExtentions
{
    public static MvcHtmlString DefaultRenderer<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, LocationModel model, SelectList selectList, object htmlAttributes)
    {
        var sb = new StringBuilder();

        var countryCode = string.IsNullOrEmpty(model.CountryCode):"":model.CountryCode;
        var dtp = "";
        if (countryCode.Equals("CA") || countryCode.Equals("US"))
        {
            dtp = htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);
        }
        else
        {
            dtp = htmlHelper.TextBoxFor(expression, htmlAttributes).ToHtmlString();
        }
        sb.AppendFormat(dtp);
        return MvcHtmlString.Create(sb.ToString());
    }

}

然后你可以使用:

@html.DefaultRenderer((m => m.ProvState, Models, newSelectList(/*some list data*/) ,new { @class = "form-control" }