簡體   English   中英

MVC使用Html.CheckBoxFor和可以為空的Bool

[英]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的實際值將始終為truefalse ,即不為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM