2016-02-12 73 views
0

使用Telerik DataAccess,我有一個數字(1,0)字段在我的數據庫稱爲chkSomething歷史上用於確定一個複選框的狀態(你知道,三態一個)Telerik用於ASP.NET MVC使用CheckBox整數

0 - Unchecked 
1 - Checked 
2 - Neither Checked nor Unchecked 

但Kendo複選框只是一個2狀態複選框。所以我想我可能只是延長了產品型號:

public partial class TripleCheckboxModel 
{ 
    private int _ID; 
    public int ID { 
    get { return this._ID; } 
    set { this._ID = value; } 
    }  
    private int _chkSomething; 
    public int ChkSomething { 
    get { return this._chkSomething; } 
    set { this._chkSomething = value; } 
    } 

    [NotMapped] 
    public bool BoolChkSomething { 
    get { return (this.ChkSomething == 1); } 
    set { this._chkSomething = (value) ? 1 : 0; } 
    } 
} 

這完全在客戶端的工作原理:

public ActionResult chk_Update([DataSourceRequest] DataSourceRequest request, TripleCheckboxModel updateItem) 
{ 
    TripleCheckboxModel originalItem = this.dbContext.TripleCheckboxModels.FirstOrDefault(q => q.ID == updateItem.ID); 

    // Here you can see the Issus 
    originalItem.BoolChkSomething = updateItem.BoolChkSomething; 

    this.dbContext.SaveChanges(); 
    return ... 
} 
:切換複選框這樣一個後調用CRUD操作時

@(Html.Kendo().CheckBoxFor(m => m.BoolChkSomething) 

然而

它不返回客戶選擇的實際狀態,而是加載項目時最初設置的狀態。我很難跟蹤這個問題,因爲看起來,當將JSON轉換回TripleCheckboxModel時,BoolChkSomething屬性中的setter不會被調用(或者在ChkSomething屬性被賦值時被覆蓋)。

有沒有一個(更容易)的方式來得到這個運行? (不更改數據庫,因爲它被另一個應用程序使用)

回答

0

答案在這裏描述:Order of serialized fields using JSON.NET。由於反序列化的工作順序相同,因此您可以確保最後不會被最後解析,而不會被其他屬性覆蓋。下面是相關的答案,它可以適用於解決這個問題:

實際上,你可以通過實現IContractResolver或控制命令>重寫DefaultContractResolverCreateProperties方法。

這裏是我的簡單實現IContractResolver的例子字母定購屬性:

public class OrderedContractResolver : DefaultContractResolver 
{ 
    protected override System.Collections.Generic.IList<JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization) 
    { 
     return base.CreateProperties(type, memberSerialization).OrderBy(p => p.PropertyName).ToList(); 
    } 
} 

,然後設置設置和序列化對象,而JSON字段將是按字母順序排列:

var settings = new JsonSerializerSettings() 
{ 
    ContractResolver = new OrderedContractResolver() 
}; 

var json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings); 
0

我認爲你必須檢查BoolChkSomething設置代碼。

set { if (value = true) { this.ChkSomething = 1; } else { this.ChkSomething = 0;} } 

應該是:

set { this._chkSomething = (value) ? 1 : 0;} 

,因爲在你的代碼不檢查是否valuetruefalse,但你要value分配true

+0

謝謝你這樣做,這樣它就無法工作。我轉向您的聲明,因爲它更加優雅,但不幸的是,這並不能解決問題,因爲一些屬性現在具有正確的值,有些屬性沒有,直接指向屬性的賦值順序。 –