EditorFor
擴展方法將您的模型連接到位於與模型類型相對應的EditorTemplates文件中的PartialView(因此在這種情況下,它將需要爲Boolean.cshtml
)。
您可以通過向編輯器模板添加條件邏輯來實現您的目標。您還需要給出部分方法來知道MoreInstructorsAllowed
屬性的值,並且您可以使用EditorFor
過載和additionalViewData
參數來傳遞此信息。
老實說,改變處理布爾值的默認功能看起來就像是你想要做的事情。如果這兩個領域有根本的聯繫,那麼將這兩個領域組合起來並將局部視圖連接到組合而不是布爾人本身會更有意義。我的意思是:
public class InstructorProperty {
public bool IsInstructor { get; set; }
public bool MoreInstructorsAllowed { get; set; }
}
和/Shared/EditorTemplates/InstructorProperty.cshtml
@model InstructorProperty
// ... Your view logic w/ the @if(MoreInstructorsClause) here.
唯一的問題是,現在你又回到不必使用CheckboxFor
方法的問題爲了應用「禁用」屬性,因爲EditorFor
方法不接受ad hoc html屬性。有一個已知的解決方法,涉及覆蓋您的ModelMetadataProvider
並使用您在ModelMetadataProvider中提供處理的屬性修飾屬性。該技術的一個實例可在以下網址獲得:http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates-2D00-ASP.Net-MVC-2.0-Beta_2D00_1.aspx。但是,這仍然涉及:(1)覆蓋布爾視圖,或者對html進行硬編碼或在其中使用CheckboxFor,(2)在InstructorProperty
視圖中使用CheckboxFor
方法,或者(3)對html進行硬編碼進入InstructorProperty
視圖。我不認爲這是有道理的結束了這麼件小事複雜的設計,所以我的解決辦法是使用這個InstructorProperty
觀點,只是補充:
@Html.CheckboxFor(_=>_.IsInstructor,
htmlAttributes: (Model.MoreInstructorsAllowed ? null : new { disabled = "disabled"}).ToString().ToLowerInvariant() });
但我得到的,每個人都有不同的風格...另一方面說明。如果您對使用複選框方法的反感與生成的命名方案有關,則Mvc框架訪問此功能的方式涉及到html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)
我在http://stackoverflow.com/questions/6590663/make-checkbox上看到了一個解決方案-disabled-in-asp-net-mvc-2-and-jquery但我想用EditorFor代替CheckBoxFor –