mvc4和EF中的Html.EditorFor和多行文本框

时间:2012-04-28 09:38:46

标签: asp.net-mvc entity-framework razor

@HTMLEditorFor自动检测模型的数据类型更适合在多行文本框中显示的标准是什么?使用MVC4,razor和EF4.3 DatabaseFirst。我正在使用控制器向导搭建的页面进行CRUD操作。 Edit.cshtml和Create.cshtml都在使用

@Html.EditorFor(model => model.message)

显示文本框。如果我编辑scaffolded Myemail.cs类,我可以添加一个像

这样的DataAnnotation
 [DataType(DataType.MultilineText)]
 public string message { get; set; }

我现在生成了一个<TextArea>(尽管开始使用时不合适(一行和178px)。当tt模板生成模型时,这不应该是自动的吗?或者我需要以某种方式修改tt如果字段是大小大于100的<TextArea>等字段,则假设varchar的模板?

干杯 添

1 个答案:

答案 0 :(得分:3)

认为我有一部分答案。通过阅读有关TextTemplatesTransformations的更多信息,我修改了我的Model1.tt以包含:

System.ComponentModel.DataAnnotations;

我还修改了WriteProperty方法以接受EdmPropertyType。该代码现在为来自指定长度的所有字符串生成多行注释&gt; 60或最大定义的字符串。它还会生成一个maxlength注释,希望有助于防止溢出。如果使用,您将需要修改现有的WriteProperty重载,如下所示。

void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{
    WriteProperty(Accessibility.ForProperty(edmProperty),
                  code.Escape(edmProperty.TypeUsage),
                  code.Escape(edmProperty),
                  code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
                  code.SpaceAfter(Accessibility.ForSetter(edmProperty)),edmProperty);
}



void WriteProperty(string accessibility, string type, string name, string getterAccessibility, string setterAccessibility,EdmProperty edmProperty = null)
{
    if (type =="string")    
    {
        int maxLength = 0;//66
        bool bres = (edmProperty != null
            && Int32.TryParse(edmProperty.TypeUsage.Facets["MaxLength"].Value.ToString(), out maxLength));
        if (maxLength > 60) // want to display as a TextArea in html 
        {
#> 
    [DataType(DataType.MultilineText)]
    [MaxLength(<#=maxLength#>)]
<#+
        }
        else
        if (maxLength < 61 && maxLength > 0) 
        {
#> 
    [MaxLength(<#=maxLength#>)]
<#+
        }
        else
        if(maxLength <=0) //varchar(max)
        {
#> 
    [DataType(DataType.MultilineText)]
<#+
        }

    }
#>
    <#=accessibility#> <#=type#> <#=name#> { <#=getterAccessibility#>get; <#=setterAccessibility#>set; }
<#+
}

确保&lt;#+行和#&gt;行开始于行的开头,因为我认为这是TT语法的要求。