viewbag对象传递到javascript

viewbag对象传递到javascript,javascript,asp.net-mvc,viewbag,Javascript,Asp.net Mvc,Viewbag,我试图通过viewbag将一个对象传递给视图,并将其传递给视图中的javascript参数 但当要将对象分配给脚本值时,字符串似乎喜欢它的名称空间 在控制器中: public ACCIDENT_REPORTS getFilledReportWithEntitiesById(int accidentReport_id) { ACCIDENT_REPORTS report = new ACCIDENT_REPORTS(); repor

我试图通过viewbag将一个对象传递给视图,并将其传递给视图中的javascript参数 但当要将对象分配给脚本值时,字符串似乎喜欢它的名称空间

在控制器中:

 public ACCIDENT_REPORTS getFilledReportWithEntitiesById(int accidentReport_id)
        {
            ACCIDENT_REPORTS report = new ACCIDENT_REPORTS();
            report = context.ACCIDENT_REPORTS.Include("ACCR_ENTITIES").Where(a => a.ID == accidentReport_id).FirstOrDefault();
            return report;
        }

    ViewBag.Report = DatabaseContext.Current.AccidentReportingRepository.getFilledReportWithEntitiesById(id); //its okey, all data in viewbag
鉴于:

<script>
    debugger
    var data = '@ViewBag.Report';
</script>
// in debugger value looks like; var data = 'Application.Database.ACCIDENT_REPORTS;

调试器
var data='@ViewBag.Report';
//在调试器中,值看起来像;var数据='Application.Database.Incident_报告;
为什么看起来像绳子?如何将viewbag的内容传递给javascript值

以下是我的实体对象返回类型:

public partial class ACCIDENT_REPORTS
    {
        public ACCIDENT_REPORTS()
        {
            this.ACCR_ENTITIES = new HashSet<ACCR_ENTITIES>();
        }

        public decimal ID { get; set; }
        public decimal FACILITY_ID { get; set; }
        public Nullable<System.DateTime> START_DATE { get; set; }
        public Nullable<System.DateTime> END_DATE { get; set; }
        public string TITLE { get; set; }
        public Nullable<decimal> ACCIDENT_TYPE { get; set; }
        public Nullable<decimal> REPORTED_UNDER { get; set; }
        public Nullable<decimal> SEVESOII_STATUS { get; set; }
        public Nullable<decimal> INDUSTRIAL_ACTIVITY { get; set; }
        public string REASON_FOR_REPORTING { get; set; }
        public string ACCIDENT_DESCRIPTION { get; set; }
        public string SITE_DESCRIPTION { get; set; }
        public string UNIT_DESCRIPTION { get; set; }
        public string CAUSES_OF_ACCIDENT { get; set; }
        public string CONSEQUENCES { get; set; }
        public string EMERGENCY_RESPONSE { get; set; }
        public string LESSONS_LEARNED { get; set; }
        public string ACCIDENTS_INVOLVING { get; set; }
        public Nullable<decimal> REPORT_STATUS { get; set; }

        public virtual ICollection<ACCR_ENTITIES> ACCR_ENTITIES { get; set; }
    }
}
公共部分类事故报告
{
公共意外报告(
{
this.ACCR_ENTITIES=new HashSet();
}
公共十进制ID{get;set;}
公共十进制工具\u ID{get;set;}
公共可为空的开始日期{get;set;}
公共可为空的结束日期{get;set;}
公共字符串标题{get;set;}
公共可为空的意外事件类型{get;set;}
{get;set;}下的公共可空报告_
公共可空SEVESOII_状态{get;set;}
公共可为空的工业_活动{get;set;}
报告{get;set;}的公共字符串原因
公共字符串描述{get;set;}
公共字符串站点描述{get;set;}
公共字符串单元描述{get;set;}
公共字符串导致{get;set;}
公共字符串结果{get;set;}
公共字符串应急响应{get;set;}
公共字符串经验教训{get;set;}
涉及{get;set;}的公共字符串
公共可为空的报告\u状态{get;set;}
公共虚拟ICollection ACCR_实体{get;set;}
}
}
getFilledReportWithEntitiesById()返回的类型是什么

大概是一个
应用程序.数据库.意外事故
。视图引擎所做的只是对给定的内容调用
.ToString()
。对于任何引用类型(基本上是
对象
的任何子对象),
.ToString()
的默认实现是返回类型名

如果需要类型的自定义字符串表示形式,则该类型需要重写
.ToString()
。例如:

public override string ToString()
{
    return string.Format("{0} - {1}", ID, Name);
}
如果对象具有
ID
属性和
Name
属性,则其字符串表示形式将是由连字符分隔的值(中间有空格)。但是,如果要构造对象的字符串表示形式,将在该方法中完成

相反,如果您不希望它是字符串,但希望JavaScript代码将其用作对象,则需要将其序列化为JSON。大概是这样的:

var data = @Json.Encode(ViewBag.Report);

(你可能需要稍微调整一下,我手头没有测试它的环境。但是你得到了一个想法…要在JavaScript代码中将它用作对象,它需要序列化为JavaScript对象文字。)

这是真正的答案

@Html.Raw(Json.Encode(Model.PlaceStatistic.ToArray()))

它返回一个enttiy对象。我也尝试过序列化,但在json内部,它也会显示名称空间字符串:S@user3347326:“实体对象”并没有真正告诉我什么。它似乎是一个自定义类型(虽然没有遵循C#命名约定,但这并不是什么大问题)。您是如何尝试将其序列化为JSON的,结果如何?正在序列化的对象的结构是什么?var data=JSON.parse(“@Html.Raw(ViewBag.Report)”);这是我一直使用的方法,可以很好地解析方法,但现在raw的内容看起来像'Application.Database.contract_REPORTS'值看起来像命名空间字符串,我想它与您所说的C#namin有关,我如何解决这个问题?(我编辑了这个问题)@user3347326:这个尝试的问题是,您仍然只是调用
ViewBag.Report
的字符串表示形式。正如我在回答中所说,对象的默认字符串表示形式是其类型名
Html.Raw()
将采用该类型名称并将其发送到客户端。因此,
JSON.parse()
只是试图解析类型名。为了将对象发送到客户端代码,您需要对其进行JSON编码(或者在对象本身上提供一个自定义的
.ToString()
实现,该实现可以做到这一点)。客户端代码无法对类型名称执行任何操作。您的意思是我必须在控制器中对其进行编码,而不是在视图中对其进行解析?