2016-12-16 52 views
2

我发现自己写这一大堆我的观点:Asp.Net Razor视图传递表达为偏

<div class="form-group"> 
    @Html.LabelFor(x => x.City) 
    @Html.EditorFor(x => x.City) 
    @Html.ValidationMessageFor(x => x.City) 
</div> 

我真的很想把这个偏_Field.cshtml,这样的事情:

@model //what model type??? 

<div class="form-group"> 
    @Html.LabelFor(Model) 
    @Html.EditorFor(Model) 
    @Html.ValidationMessageFor(Model) 
</div> 

这可能然后通过调用:

@Html.Partial("_Field", x => x.City) 

会是什么@model类型在我的p如果我想要完成这样的事情,那就是艺术吗?

UPDATE这工作,但我宁愿使用的部分,便于更改模板的:

public static MvcHtmlString Field<TModel, TItem>(this HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expr) 
{ 
    var h = "<div class='form-group'>"; 
    h += $"{html.LabelFor(expr)}{html.EditorFor(expr)}{html.ValidationMessageFor(expr)}"; 
    h += "</div>"; 

    return MvcHtmlString.Create(h); 
} 

回答

2

那是不可能的。但是,您想要的与编辑器模板非常相似。从本质上讲,你刚才创建Views/Shared/EditorTemplates视图以下约定的名字命名:一个系统或自定义类型

  • (String.cshtml,Int32.cshtml,MyAwesomeClass.cshtml等)
  • 之一DataType enum(EmailAddress.cshtml,Html.cshtml,PhoneNumber.cshtml等)的成员。与UIHint属性

    [DataType(DataType.EmailAdress)] 
    public string Email { get; set; } 
    
  • 任何你想要的东西,结合:

    [UIHint("Foo")] 
    public string Foo { get; set; } 
    

    然后将对应于Foo.cshtml编辑模板,然后您将应用适当的DataType属性的特性

在你的意见,那么,您只需使用Html.EditorFor

@Html.EditorFor(x => x.City) 

然后,例如,你可以有Views/Shared/EditorTemplates/String.cshtml为:

<div class="form-group"> 
    @Html.Label("", new { @class = "control-label" }) 
    @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "form-control" }) 
    @Html.ValidationMessage("") 
</div> 

(空引号的占位符。谢天谢地,剃刀会自动填写相应的属性名称。)

调用EditorFor然后,将打印所有这些,而不仅仅是默认的文本输入。你可以更进一步。如果您有兴趣,我的博客上有somearticles更详细的内容。

UPDATE

值得一提的一些功能的EditorFor

  1. 您可以直接通过模板来调用,这意味着你可以自定义模板是动态和所使用的每例如:

    @Html.EditorFor(x => x.City, "MyCustomEditorTemplate") 
    
  2. 您可以通过additionalViewData。这个匿名对象的成员被添加到ViewData动态词典中。可能的话,您可以使用它在您的编辑器模板中进行分支以涵盖其他场景。例如:

    @Html.EditorFor(x => x.City, new { formGroup = false }) 
    

    然后在编辑器中的模板:

    @{ var formGroup = ViewData["formGroup"] as bool? ?? true; } 
    @if (formGroup) 
    { 
        <!-- Bootstrap form group --> 
    } 
    else 
    { 
        <!-- Just the input --> 
    } 
    
+0

我认为使用'EditorTemplates',但问题是我使用他们所有的地方,但不总是* *要他们用额外的div等包裹,我不总是想要一个标签。我想我可以创建基于UIHint的模板,并使用_ViewStart来减少html。去坐这个。 – mxmissile

+0

请参阅上面的我的更新。可能会给你一些工作。 –