Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用带有整数的复选框的ASP.NET MVC Telerik UI_Asp.net Mvc_Telerik_Telerik Mvc - Fatal编程技术网

Asp.net mvc 使用带有整数的复选框的ASP.NET MVC Telerik UI

Asp.net mvc 使用带有整数的复选框的ASP.NET MVC Telerik UI,asp.net-mvc,telerik,telerik-mvc,Asp.net Mvc,Telerik,Telerik Mvc,使用Telerik DataAccess,我的数据库中有一个数字(1,0)字段,名为chkSomething,过去用于确定复选框的状态(您知道,三态) 但是剑道复选框只是一个2状态复选框。所以我想我可以扩展这个模型: public partial class TripleCheckboxModel { private int _ID; public int ID { get { return this._ID; } set { this._ID = value; } }

使用Telerik DataAccess,我的数据库中有一个数字(1,0)字段,名为chkSomething,过去用于确定复选框的状态(您知道,三态)

但是剑道复选框只是一个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 ...
}
它不返回客户端选择的实际状态,而是在加载项时最初设置的状态。我很难跟踪这个问题,因为在将JSON转换回TripleCheckboxModel时,BoolChkSomething属性中的setter不会被调用(或者在分配ChkSomething属性时被覆盖)

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

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

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

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

因为在您的代码中,您没有检查
值是否为
true
false
,而是将
true
赋值给

,答案如下所述:。由于反序列化的工作顺序相同,因此可以确保最后解析NotMapped属性,而不会被其他属性覆盖。以下是相关的答案,可以对其进行调整以解决此问题:

实际上,您可以通过实现
IContractResolver
或>覆盖
DefaultContractResolver
CreateProperties
方法来控制订单

下面是我的
IContractResolver
的一个简单实现示例,它按字母顺序排列属性:


谢谢你指出这一点,这样做是行不通的。我切换到您的语句,因为它更加优雅,但不幸的是,这并不能解决问题,因为有些属性现在有正确的值,有些没有,这直接指向属性的分配顺序。
set { this._chkSomething = (value) ? 1 : 0;}
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();
    }
}
var settings = new JsonSerializerSettings()
{
    ContractResolver = new OrderedContractResolver()
};

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