我在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的类型,但在视图中我没有指定类型。
如何将其转变为助手?
答案 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" }