2016-12-16 31 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

請參閱上面的我的更新。可能會給你一些工作。 –