【问题标题】:How to use TextBoxFor in helper?如何在助手中使用 TextBoxFor?
【发布时间】:2014-04-18 12:20:51
【问题描述】:

我在 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 的类型,但在视图中我没有指定类型。

如何将其移入 helper 中?

【问题讨论】:

  • 你所说的“帮手”到底是什么意思?
  • 这是在共享 (app_code) 文件夹中使用 @helper 方法的问题。如果将辅助方法放在主视图中,则可以使用@Html. 方法。

标签: c# asp.net-mvc razor


【解决方案1】:

根据我的意见,您可以将自定义辅助方法打包在一个静态类中,并将您的方法声明为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()的常用语法来使用这个辅助方法

希望这会有所帮助。

编辑: 如果您使用内联辅助方法,请仅将辅助方法保留在您的视图中使用它的地方。否则,请尝试创建一个外部 html 辅助方法,如上所示。

【讨论】:

    【解决方案2】:

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

    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" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多