使用带有Integer的CheckBox的ASP.NET MVC的Telerik UI

时间:2016-02-12 16:38:18

标签: asp.net-mvc telerik telerik-mvc

使用Telerik DataAccess,我的数据库上有一个名为chkSomething的数字(1,0)字段,这个字段历来用于确定复选框的状态(你知道,三态)

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

但是Kendo Checkbox只是一个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; }
  }
}

在客户端完美运作:

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

然而,在切换像这样的复选框之后调用CRUD操作时:

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 ...
}

它不会返回客户端选择的实际状态,而是返回在加载Item时最初设置的状态。我很难跟踪这个问题,因为似乎在将JSON转换回TripleCheckboxModel时,BoolChkSomething属性中的setter不会被调用(或者在分配ChkSomething属性时被覆盖)。

是否有(更简单的方法)让它运行? (不改变数据库,因为它被另一个应用程序使用)

2 个答案:

答案 0 :(得分:0)

我认为你必须检查BoolChkSomething设置代码。

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

应该是:

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

因为在您的代码中,您不会检查valuetrue还是false,而是将true分配给value

答案 1 :(得分:0)

答案在此处描述:Order of serialized fields using JSON.NET。由于反序列化以相同的顺序工作,您可以确保最后解析NotMapped属性,而不是被其他属性覆盖。以下是相关答案,可以对其进行调整以解决此问题:

  

您实际上可以通过实施IContractResolver或>覆盖DefaultContractResolver的{​​{1}}方法来控制订单。

     

以下是我简单实现CreateProperties的示例,它按字母顺序对属性进行排序:   

IContractResolver
  

然后设置设置并序列化对象,JSON字段将按字母顺序排列:   

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();
    }
}