Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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
C# Kendo MultiSelect正在生成循环引用异常(仅当数据存在时)_C#_Asp.net Mvc_Razor_Kendo Ui - Fatal编程技术网

C# Kendo MultiSelect正在生成循环引用异常(仅当数据存在时)

C# Kendo MultiSelect正在生成循环引用异常(仅当数据存在时),c#,asp.net-mvc,razor,kendo-ui,C#,Asp.net Mvc,Razor,Kendo Ui,我有两个数据库表:“资产”;和“地位” 状态有2列:Id(长主键);和说明(字符串) 资产有3列:Id(长主键)、StatusId(长主键);OrderInfo(字符串) StatusId(在资产中)是与Id(在状态中)的外键关系 如果资产表中没有数据,我可以使用以下代码从状态表的数据生成视图中的MultiSelect下拉列表。但是,如果资产表中有任何数据,我会从Kendo().MultiSelect()函数中得到一个循环引用异常。我如何解决这个问题 以下是HomeController中的C#:

我有两个数据库表:“资产”;和“地位”

状态有2列:Id(长主键);和说明(字符串)

资产有3列:Id(长主键)、StatusId(长主键);OrderInfo(字符串)

StatusId(在资产中)是与Id(在状态中)的外键关系

如果资产表中没有数据,我可以使用以下代码从状态表的数据生成视图中的MultiSelect下拉列表。但是,如果资产表中有任何数据,我会从Kendo().MultiSelect()函数中得到一个循环引用异常。我如何解决这个问题

以下是HomeController中的C#:

public ActionResult Index()
{                     
    return View(new HomeVm( _db.Status,  _db.Assets));
}
这是C#视图模型HomeVm.cs

public HomeVm(IEnumerable<Status> statuses, long[] statusIds, IEnumerable<Asset> assets )
{
    Statuses = statuses;
    StatusIds = statusIds;
    Assets = assets;
}

public IEnumerable<Status> Statuses { get; set; }
long[] StatusIds { get; set; }
public IEnumerable<Asset> Assets { get; set; }
公共HomeVm(IEnumerable状态、long[]状态ID、IEnumerable资产)
{
状态=状态;
StatusIds=StatusIds;
资产=资产;
}
公共IEnumerable状态{get;set;}
long[]StatusIds{get;set;}
公共IEnumerable资产{get;set;}
以下是视图中的CSHTML(razor语法):

@model BoiseHardware.Models.HomeVm

@using (Html.BeginForm())
{
    <div>
        @(Html.Kendo().MultiSelectFor(model => model.StatusIds)
          .DataTextField("Description")
          .DataValueField("Id")
          .BindTo(Model.Status)
          .Placeholder("Statuses")
          )
    </div>

    <input type="submit" value="Show Me The Data!"/>
 }

<div>
    @(Html.Kendo().Grid(Model.Assets)
        .Name("Assets")
        .Pageable()
        .Sortable()
    )
</div>
@model BoiseHardware.Models.HomeVm
@使用(Html.BeginForm())
{
@(Html.Kendo().MultiSelectFor(model=>model.StatusIds)
.DataTextField(“说明”)
.DataValueField(“Id”)
.BindTo(模型状态)
.占位符(“状态”)
)
}
@(Html.Kendo().Grid(Model.Assets)
.名称(“资产”)
.Pageable()
.Sortable()
)
以下是错误响应(来自Google Chrome v.54)

序列化“System.Data.Entity.DynamicProxies.Asset_E86957A5452298EBC7CD18E0C7D70EC50A3EF7827AB78015AACF96D8D8F33B2B”类型的对象时检测到循环引用。 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。 异常详细信息:System.InvalidOperationException:序列化“System.Data.Entity.DynamicProxies.Asset_E86957A5452298EBC7CD18E0C7D70EC50A3EF7827AB78015AACF96D8D8F33B2B”类型的对象时检测到循环引用。 源错误: 第7行:{ 第8行: 第9行:@(Html.Kendo().MultiSelectFor(model=>model.StatusIds) 第10行:.DataTextField(“说明”) 第11行:.DataValueField(“Id”)
谢谢!

您的问题来自JSON序列化,而不是剑道UI本身。请参阅下面的文章,了解您的问题的解决方案:


我找到了解决方案。希望这对其他人有所帮助

1-我添加了一个简单的视图模型:

public class MultiSelectVm
{
    public MultiSelectVm() { }

    public long Id { get; set; }
    public string Description { get; set; }
}
public ActionResult Index()
{                     
    var statuses = _db.Status.Select(m => new MultiSelectVm { Id = m.Id, Description = m.Description }).ToList();
    return View(new HomeVm( statuses,  _db.Assets));
}
2-修改了对DB的调用以使用视图模型:

public class MultiSelectVm
{
    public MultiSelectVm() { }

    public long Id { get; set; }
    public string Description { get; set; }
}
public ActionResult Index()
{                     
    var statuses = _db.Status.Select(m => new MultiSelectVm { Id = m.Id, Description = m.Description }).ToList();
    return View(new HomeVm( statuses,  _db.Assets));
}

干杯…

谢谢Vesselin。我看到了那篇文章,但它没有提供所需的线索。通过反复试验和有根据的猜测,我解决了这个问题并发布了解决方案。