C#-自定义HTML帮助程序

C#-自定义HTML帮助程序,c#,html,asp.net-mvc-4,twitter-bootstrap,html-helper,C#,Html,Asp.net Mvc 4,Twitter Bootstrap,Html Helper,我有以下代码在视图模型中设置变量 [Required] [DataType(DataType.Password)] public string Password { get; set; } 我还有一个引导助手类,它使用以下代码创建文本框: public static MvcHtmlString TextboxGroupFor<TModel, TProperty>( this HtmlHelper<TModel> html, Expression<F

我有以下代码在视图模型中设置变量

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
我还有一个引导助手类,它使用以下代码创建文本框:

public static MvcHtmlString TextboxGroupFor<TModel, TProperty>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TProperty>> expression,
    BootstrapInputSizes? width = BootstrapInputSizes.Defalut)
{
    var placeholder = string.Empty;

    if (html.ViewData.ModelMetadata.AdditionalValues.ContainsKey("placeholder"))
    {
        placeholder = html.ViewData.ModelMetadata.AdditionalValues["placeholder"] as string;
    }

    var sb = new StringBuilder();
    sb.AppendLine("<div class=\"form-group col-xs-12\">");
    sb.AppendLine(html.LabelFor(expression, new { @class = "col-sm-2 control-label" }).ToHtmlString());
    sb.AppendLine("<div class=\" col-sm-6\">");
    sb.AppendLine(html.TextBoxFor(expression,
        new { @class = "form-control", @placeholder = placeholder }).ToHtmlString());
    sb.AppendLine("</div></div>");
    return new MvcHtmlString(sb.ToString());
}
看起来像:

sb.AppendLine(html.TextBoxFor(expression,
               new { @class = "form-control", @placeholder = placeholder , @type ="Password"}).ToHtmlString());
取决于数据类型是否设置为“密码”


谢谢大家

您可以使用该方法获取lambda表达式指向的属性的
modelmetada
,然后只需检查属性的值:

var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
if (metadata.DataTypeName == "Password")
{
    ... your model property was decorated with [DataType(DataType.Password)]
}

很好的回答,关于实际设置类型。。是否有一种简单的方法,例如,如果Password Type=Password,如果Email Type=Email If nothing Type=nulls,则有一种简单的方法,但我认为在这种情况下,它会很难看。如果使用if/else语句生成
TextBoxFor
Passwordfor
助手,代码的可读性会更高。至于你之前关于But@Type=Null的评论在C#中不起作用,事实上我不太明白这句话的意思。非常好的建议,谢谢!
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
if (metadata.DataTypeName == "Password")
{
    ... your model property was decorated with [DataType(DataType.Password)]
}