ganesha < - > scorm 2004:choice controlmode?(ganesha <--> scorm 2004 : choice controlmode?)
我需要使用scorm 2004的选择控制模式,所以我做了这个非常基本的测试:
这是我的表现:
<?xml version="1.0" encoding="UTF-8"?> <manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" xmlns:imsmd="http://ltsc.ieee.org/xsd/LOM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3" xmlns:imsss="http://www.imsglobal.org/xsd/imsss" xmlns:adlseq="http://www.adlnet.org/xsd/adlseq_v1p3" xmlns:adlnav="http://www.adlnet.org/xsd/adlnav_v1p3" identifier="MANIFEST-2F10A7A25FC691A6212BD9CB0B505D44" xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd http://ltsc.ieee.org/xsd/LOM lom.xsd http://www.adlnet.org/xsd/adlcp_v1p3 adlcp_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd http://www.adlnet.org/xsd/adlseq_v1p3 adlseq_v1p3.xsd http://www.adlnet.org/xsd/adlnav_v1p3 adlnav_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd"> <metadata> <schema>ADL SCORM</schema> <schemaversion>2004 3rd Edition</schemaversion> </metadata> <organizations default="ORG"> <organization identifier="ORG" structure="hierarchical"> <title>06 Navigation</title> <item identifier="page1" isvisible="true" identifierref="RES-page1"> <title>page1</title> <item identifier="page2" isvisible="true" identifierref="RES-page2"> <title>page2</title> </item> <item identifier="page3" isvisible="true" identifierref="RES-page3"> <title>page3</title> </item> <imsss:sequencing> <imsss:controlMode choice="true" choiceExit="false" flow="false" useCurrentAttemptObjectiveInfo="false" useCurrentAttemptProgressInfo="false"/> </imsss:sequencing> </item> </organization> </organizations> <resources> <resource identifier="RES-page1" adlcp:scormType="sco" type="webcontent" href="page1.html"> <file href="page1.html" /> <file href="js/jquery-1.8.3.min.js" /> <file href="js/SCORM_API_wrapper.js" /> <file href="js/lmsCommunication.js" /> </resource> <resource identifier="RES-page2" adlcp:scormType="sco" type="webcontent" href="page2.html"> <file href="page2.html" /> <file href="js/jquery-1.8.3.min.js" /> <file href="js/SCORM_API_wrapper.js" /> <file href="js/lmsCommunication.js" /> </resource> <resource identifier="RES-page3" adlcp:scormType="sco" type="webcontent" href="page3.html"> <file href="page3.html" /> <file href="js/jquery-1.8.3.min.js" /> <file href="js/SCORM_API_wrapper.js" /> <file href="js/lmsCommunication.js" /> </resource> </resources> </manifest>
在第1页,我连接到API并成功获取用户名。
点击后,我尝试使用此js代码转到第2页:
var scorm = pipwerks.SCORM; $( document ).ready( init ); function init() { scorm.version = "2004"; connect(); var learnerName = getValue( "cmi.learner_name" ); $( "#Name" ).html( "Bonjour " + learnerName + " !!!" ); $( "#goto2" ).click( goto2 ); $( window ).unload( disconnect ); } function goto2() { if( getValue( "adl.nav.request_valid.choice.{target=page2}" ) == "true" ) { setValue( 'adl.nav.request', '{target=page2}choice' ); disconnect(); } /* if( getValue( "adl.nav.request_valid.continue" ) == "true" ) { setValue( 'adl.nav.request', 'continue' ); disconnect(); } */ } function connect() { if( !scorm.connection.isActive ) { var isSuccess = scorm.init(); var msg = "Connexion : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function disconnect() { if( scorm.connection.isActive ) { var isSuccess = scorm.quit(); var msg = "Déconnexion : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function save() { if( scorm.connection.isActive ) { var isSuccess = scorm.save(); var msg = "Sauvegarde : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function getValue( parameter ) { var value = null; if( scorm.connection.isActive ) { value = scorm.get( parameter ); var msg = "Get " + parameter + " : " + ( ( value )? value : "échec" ); var isSuccess = ( value )? true : false; log( msg, isSuccess ); } return value; } function setValue( parameter, value ) { if( scorm.connection.isActive ) { var isSuccess = scorm.set( parameter, value ); var msg = "Set " + parameter + " = " + value + " : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function log( msg, isSuccess ) { $( "#console" ).append( "<div style=\"color:" + ( ( isSuccess )? "blue" : "orangered" ) + ";\">" + msg + "</div>" ); }
scorm.set('adl.nav.request','{target = page2} choice')不起作用,它返回一个空字符串。
为什么不起作用? 可能是js中的错误或清单中的错误树?
我没有成功找到好的语法,我不确定我的探索方式......
I need to use choice controlmode of scorm 2004, so I have done this very basic test :
This is my manifest :
<?xml version="1.0" encoding="UTF-8"?> <manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" xmlns:imsmd="http://ltsc.ieee.org/xsd/LOM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3" xmlns:imsss="http://www.imsglobal.org/xsd/imsss" xmlns:adlseq="http://www.adlnet.org/xsd/adlseq_v1p3" xmlns:adlnav="http://www.adlnet.org/xsd/adlnav_v1p3" identifier="MANIFEST-2F10A7A25FC691A6212BD9CB0B505D44" xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd http://ltsc.ieee.org/xsd/LOM lom.xsd http://www.adlnet.org/xsd/adlcp_v1p3 adlcp_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd http://www.adlnet.org/xsd/adlseq_v1p3 adlseq_v1p3.xsd http://www.adlnet.org/xsd/adlnav_v1p3 adlnav_v1p3.xsd http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd"> <metadata> <schema>ADL SCORM</schema> <schemaversion>2004 3rd Edition</schemaversion> </metadata> <organizations default="ORG"> <organization identifier="ORG" structure="hierarchical"> <title>06 Navigation</title> <item identifier="page1" isvisible="true" identifierref="RES-page1"> <title>page1</title> <item identifier="page2" isvisible="true" identifierref="RES-page2"> <title>page2</title> </item> <item identifier="page3" isvisible="true" identifierref="RES-page3"> <title>page3</title> </item> <imsss:sequencing> <imsss:controlMode choice="true" choiceExit="false" flow="false" useCurrentAttemptObjectiveInfo="false" useCurrentAttemptProgressInfo="false"/> </imsss:sequencing> </item> </organization> </organizations> <resources> <resource identifier="RES-page1" adlcp:scormType="sco" type="webcontent" href="page1.html"> <file href="page1.html" /> <file href="js/jquery-1.8.3.min.js" /> <file href="js/SCORM_API_wrapper.js" /> <file href="js/lmsCommunication.js" /> </resource> <resource identifier="RES-page2" adlcp:scormType="sco" type="webcontent" href="page2.html"> <file href="page2.html" /> <file href="js/jquery-1.8.3.min.js" /> <file href="js/SCORM_API_wrapper.js" /> <file href="js/lmsCommunication.js" /> </resource> <resource identifier="RES-page3" adlcp:scormType="sco" type="webcontent" href="page3.html"> <file href="page3.html" /> <file href="js/jquery-1.8.3.min.js" /> <file href="js/SCORM_API_wrapper.js" /> <file href="js/lmsCommunication.js" /> </resource> </resources> </manifest>
On page1, I connect to API and succeed to get username.
On click, I try to go to page 2 with this js code :
var scorm = pipwerks.SCORM; $( document ).ready( init ); function init() { scorm.version = "2004"; connect(); var learnerName = getValue( "cmi.learner_name" ); $( "#Name" ).html( "Bonjour " + learnerName + " !!!" ); $( "#goto2" ).click( goto2 ); $( window ).unload( disconnect ); } function goto2() { if( getValue( "adl.nav.request_valid.choice.{target=page2}" ) == "true" ) { setValue( 'adl.nav.request', '{target=page2}choice' ); disconnect(); } /* if( getValue( "adl.nav.request_valid.continue" ) == "true" ) { setValue( 'adl.nav.request', 'continue' ); disconnect(); } */ } function connect() { if( !scorm.connection.isActive ) { var isSuccess = scorm.init(); var msg = "Connexion : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function disconnect() { if( scorm.connection.isActive ) { var isSuccess = scorm.quit(); var msg = "Déconnexion : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function save() { if( scorm.connection.isActive ) { var isSuccess = scorm.save(); var msg = "Sauvegarde : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function getValue( parameter ) { var value = null; if( scorm.connection.isActive ) { value = scorm.get( parameter ); var msg = "Get " + parameter + " : " + ( ( value )? value : "échec" ); var isSuccess = ( value )? true : false; log( msg, isSuccess ); } return value; } function setValue( parameter, value ) { if( scorm.connection.isActive ) { var isSuccess = scorm.set( parameter, value ); var msg = "Set " + parameter + " = " + value + " : " + ( ( isSuccess )? "succès" : "échec" ); log( msg, isSuccess ); } } function log( msg, isSuccess ) { $( "#console" ).append( "<div style=\"color:" + ( ( isSuccess )? "blue" : "orangered" ) + ";\">" + msg + "</div>" ); }
the scorm.set( 'adl.nav.request', '{target=page2}choice' ) doesn't work, it return an empty string.
Why is it not working ? an error in js or a bad tree in manifest maybe ?
I'm not succeed to find the good syntax and I'm not sure anymore to what way I have explore...
原文:https://stackoverflow.com/questions/13503052
最满意答案
这是我在控制台应用程序中尝试过的,并按预期工作:
namespace Q7122388 { #region Imports using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Linq; #endregion public class Product { [Key] public int Id { get; set; } public virtual string Name { get; set; } public virtual ICollection<Category> Categories { get; set; } } public class Category { [Key] public int Id { get; set; } public virtual string Name { get; set; } public virtual ICollection<Product> Products { get; set; } } public class DatabaseContext : DbContext { public virtual DbSet<Product> Products { get; set; } public virtual DbSet<Category> Categories { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Product>() .HasMany<Category>(m => m.Categories) .WithMany().Map(m => m.MapLeftKey("ProductId") .MapRightKey("CategoryId") .ToTable("ProductCategories")); base.OnModelCreating(modelBuilder); } } class Program { static void Main(string[] args) { Database.SetInitializer(new DropCreateDatabaseAlways<DatabaseContext>()); using (var context = new DatabaseContext()) context.Database.Initialize(true); } } }
This is what I've tried in a console application and works as expected :
namespace Q7122388 { #region Imports using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Linq; #endregion public class Product { [Key] public int Id { get; set; } public virtual string Name { get; set; } public virtual ICollection<Category> Categories { get; set; } } public class Category { [Key] public int Id { get; set; } public virtual string Name { get; set; } public virtual ICollection<Product> Products { get; set; } } public class DatabaseContext : DbContext { public virtual DbSet<Product> Products { get; set; } public virtual DbSet<Category> Categories { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Product>() .HasMany<Category>(m => m.Categories) .WithMany().Map(m => m.MapLeftKey("ProductId") .MapRightKey("CategoryId") .ToTable("ProductCategories")); base.OnModelCreating(modelBuilder); } } class Program { static void Main(string[] args) { Database.SetInitializer(new DropCreateDatabaseAlways<DatabaseContext>()); using (var context = new DatabaseContext()) context.Database.Initialize(true); } } }
相关问答
更多-
是的,您可以通过SqlQuery执行任何SQL(包括存储过程)。 关于不支持SP的公告意味着您无法将SP过程映射到在EDMX中当前可能对您的实体执行的插入,更新,删除操作。 Yes you can execute any SQL (including stored procedures) by SqlQuery. The announcement about not supported SP means that you can't map SP procedures to Insert, Update, ...
-
正如大家所提到的,你需要分析你的查询。 假设您使用的是SQL Server,那么您可以仅使用SQL Server Profiler并比较查询和执行计划。 与任何性能问题一样,您必须首先进行测量。 在你的情况下,你必须做更多。 你必须用每种技术测量两次,并确保你比较苹果和苹果。 如果您可以排除正在生成的sql,那么您将不得不测量应用程序代码,以便可能排除那里的瓶颈。 我怀疑这将是生成的查询。 As everyone has mentioned, you need to profile your queries ...
-
直到您指示EF执行此操作后,它们才会映射到一张表中。 简单地定义你的类,如: public abstract class BaseSearchType { public int Id { get; set; } public string text { get; set; } public int value { get; set; } } public class BooleanSearchTypeTable : BaseSearchType { } public class ...
-
这是我在控制台应用程序中尝试过的,并按预期工作: namespace Q7122388 { #region Imports using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Linq; #endregion public cla ...
-
Discriminator是在使用Table Per Hierarchy方法时添加到表中的列。 我认为你所寻找的是“每种类型的表(TPT)”。 按如下方式装饰您的EmployeeInfo类: [Table("EmployeeInfo")] public class EmployeeInfo : Employee 或者在下面添加OnModelCreating事件: protected override void OnModelCreating(DbModelBuilder modelBuilder) { ...
-
不,这是不可能的,我怀疑它在SQL服务器中是否有效。 数据库关系要求一端变得依赖。 这意味着它引用了主端的主键(PK) - 我们称之为外键(FK)。 如果我们谈论一对一关系,则必须将FK标记为唯一,以便从属表中只有一个记录可以从主表中引用给定记录。 在这种情况下,唯一有效的关系是0..1 - 1,其中principal可以不依赖而存在,但依赖只能在与现有主体相关时才存在,因为它的FK值必须设置为主体的PK值。 从理论上讲,FK可以为空,但它取决于数据库如何实现唯一约束的方式。 如果数据库将null计为另一个 ...
-
public class NVarcharMaxAttribute : Attribute { } public class NVarcharMaxAttributeConvention : AttributeConfigurationConvention
{ public override void Apply(PropertyInfo memberInfo, Str ... -
这是正确的,并且不仅适用于Code-first。 如果您的加入表中有额外的字段,您将把它映射为实体。 反之亦然,如果您想在加入表中添加额外字段,则需要创建一个新实体,并为Teacher和Student实体提供零或一对多或一对多导航属性。 在任何情况下,您都无法访问Teacher.Students和Student.Teachers并且必须通过中间实体。 或者,您可以考虑以不同方式对数据库结构进行建模,并将额外信息提取到Teacher或Student或第四实体中。 但这完全取决于您的情况。 That's cor ...
-
什么是与EF 4.1查询“很多很多”关系的正确方法?(What is right way to query “Many-Many-Many” relationship with EF 4.1?)[2023-12-16]
尝试在查询中使用“include”修饰符,例如: context ctx = new context()// context是这种情况下的实体上下文 var query = from c in ctx.posts.include(“tags.users”)其中p.tags.Followers.ID = TargetUserID 这应该涵盖它 (from p in db.Posts from t in p.Tags from f in t.Followers where f.Id == id select p ... -
这不是实体框架的问题,而是SQL服务器的问题。 我不认为异常实际上意味着循环级联删除。 它更可能意味着多个级联删除路径,因为连接表记录可以从类别和产品方面删除,因为从商店级联。 SQL服务器不允许这样做,因为它需要一些更复杂(和慢速)的算法来正确计算哪些记录以及何时必须在级联时删除。 简单地说,您必须打破这一点,这实际上意味着您必须在删除商店之前手动删除所有相关记录(类别或产品)。 这将需要存储过程(或直接SQL DELETE命令),否则您将必须首先加载所有这些并逐个删除它们。 编辑: 正如您在评论中指出的 ...