2016-02-12 28 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

谢谢你这样做,这样它就无法工作。我转向您的声明,因为它更加优雅,但不幸的是,这并不能解决问题,因为一些属性现在具有正确的值,有些属性没有,直接指向属性的赋值顺序。 –