對於未來的讀者,我個人認爲,HtmlHelpers的設計是爲了呈現Html(顧名思義)。我喜歡創建不同的方式來渲染項目是創建EditFor和DisplayFor模板。爲了確保這是高度可重用的,我還創建了專門爲這些模板設計的模型。通過您的設計,我的模型和模板可能如下所示:
/Models/Controller/ControllerActionViewModel。CS
public class ControllerActionViewModel
{
public ControllerActionViewModel()
{
this.CheckboxBoolTemplate = new CheckboxBoolTemplate(false, true);
}
[Display(Name = "My Boolean")]
public SelectBoolTemplate MyBoolean { get; set; }
}
/TemplateModels/ControllerActionViewModel.cs
public sealed class SelectBoolTemplate
{
private bool _valuesSwapped = false;
private bool? _value;
private bool _defaultValue = false;
public SelectBoolTemplate()
{
}
public SelectBoolTemplate(bool valuesSwapped)
{
this._valuesSwapped = valuesSwapped)
}
public SelectBoolTemplate(bool defaultValue, bool valuesSwapped)
{
this._defaultValue = defaultValue;
this._valuesSwapped = valuesSwapped)
}
public bool Value
{
get
{
if (this._value.HasValue)
{
return this._value.Value
}
return this._defaultValue;
}
set
{
this._value = value;
}
}
}
/Views/Shared/EditorTemplates/SelectBoolTemplate.cshtml
@model SelectBoolTemplate
@{
string propertyName = ViewContext.ViewData.ModelMetadata.PropertyName;
string fullPropertyName = ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;
string labelText = ViewContext.ViewData.ModelMetadata.DisplayName
?? ViewContext.ViewData.ModelMetadata.PropertyName;
}
@Html.LabelForModel()
@Html.Checkbox(fullPropertyName, Model.Value)
隱藏字段我增加了一個可能的解決方案,請參閱我的編輯: –
「@ Html.CheckBox(」YourElementName「,Model.MyBoolean)」 是你想要的嗎? –
@Leon_SFS:不,您的代碼將呈現相同。我希望能夠在我的問題中使用確切的代碼,但幫助者知道我將該值設置爲false,因此將相應的隱藏輸入元素的值設置爲true。隱藏元素的目的是表示複選框元素的值的對立面,所以助手應該確保它始終是相反的。 – dairystatedesigns