[英]MVC use Html.CheckBoxFor with nullable Bool
我有一個復選框,我想在我的視圖中顯示一個名為public的字段,它基本上表示特定行是否公開。 在數據庫中,這是一個位字段,但它允許空值,因為之前的表如何工作。
我正在使用Html.CheckBoxFor但它抱怨這個字段,因為在系統中它不是bool類型,而是bool? 類型。 我想要做的是,如果字段值為null,那么它在前端計為false(遺憾的是,更新數據庫值本身不是一個選項)。
我嘗試過使用GetValueOrDefault,並在我的模型文件中放置一個默認值:
public class Model
{
public bool? Public { get; set; }
public SearchModel()
{
Public = false;
}
}
但它抱怨這個,給我以下錯誤:
An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code
Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
所以我不確定如何從這里進步,有人可以幫我指出正確的方向嗎?
編輯:
這是我試圖用來顯示復選框的視圖上的代碼。 在這個例子中,我添加了一些額外的html屬性,使其顯示為切換而不是簡單的復選框:
Html.CheckBoxFor(model => model.Public, new {data_toggle = "toggle", data_off = "No", data_on = "Yes", data_size = "small"})
將表達式傳遞給無法計算的模板化助手之一時,會發生特定的異常。 請記住,當您使用基於表達式的幫助程序時,實際上並沒有按值傳遞屬性,而是表示模型上的屬性以及幫助程序將用於引用該屬性的表達式,生成字段名稱等等
您還沒有顯示您正在執行此操作的實際代碼,但這實際上意味着您無法執行以下操作:
@Html.EditorFor(m => m.Public.GetValueOrDefault())
因為模板化助手無法將其解析為與模型上的屬性匹配的表達式。
至於你在這里的實際基本關注點,即如果它為null,則將值設置為false,你只需要一個自定義的getter和setter。 @utaco的答案提供了新的更簡單的自動實現屬性的C#6.0方法,默認值為:
public bool? Public { get; set; } = false;
對於以前版本的C#,您需要以下內容:
private bool? public;
public bool? Public
{
get { return public ?? false; }
set { public = value; }
}
但是,如果你沒有意圖將它實際置為null,那么將Public
保持為可以為空的bool會讓你的代碼變得更加困難。 假設您可以將其更改為bool
(即這是一個視圖模型,而不是與數據庫表綁定的實際實體類),那么您應該這樣做。 你仍然希望將私有保留為可空。 這允許你接受setter中的null,但是在getter中將它們強制轉換為false
值,這意味着public的實際值將始終為true
或false
,即不為null。
如果你使用c#6.0或更高版本,你可以使用:
public bool YourProp { get; set; } = false;
這不需要初始化。 @Html.EditorFor(m => m.AnyNullableProperty)
下面按照預期為我工作。
<div class="form-group">
@Html.LabelFor(model => model.RequiresBatchNumberOnReceipt, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(m => m.RequiresBatchNumberOnReceipt)
@Html.ValidationMessageFor(model => model.RequiresBatchNumberOnReceipt)
</div>
</div>
我采用了克里斯普拉特的想法,但使用的卻不一樣。 我創建了一個ViewModel並添加了一個非可空屬性來更新可空屬性,反之亦然。
public bool? Public { get; set; }
private bool _public;
public bool _Public
{
get { return Public ?? false; }
set
{
_public = value;
Public = value;
}
}
現在在View中,您將使用非可空值進行更新而不是可空值
Html.CheckBoxFor(model => model._Uploaded)
這種方法的唯一問題是,如果保存更改,您將不會返回null。 這對我有用,因為NULL值在我們的程序中表示為false。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.