使用iframe将 Visual Studio LightSwitch应用程序集成到现有网站中

分享于 

34分钟阅读

Web开发

  繁體

活动示例:

http://lightswitchhelpwebsite.com/Demos/ThingsForSale.aspx

关于LightSwitch的介绍性文章的收费,请参阅:

http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/12/Online-Ordering-System-An-End-To-End-LightSwitch-Example.aspx

注意:你必须拥有 Visual Studio 专业 或者更高的级别,以执行本教程中的所有步骤

你可以从此链接下载的LightSwitch:

http://www.microsoft.com/visualstudio/en-us/lightswitch

将多个LightSwitch应用程序放入你的网站

Visual Studio LightSwitch suffers我称之为"全屏限制"。 想要填补整个屏幕,并且想要管理角色和用户。 如果你只需要一个应用程序,这很好,但是在许多情况下,你想要一个收费的LightSwitch应用程序作为单个门户中的一组应用。 你希望所有应用程序共享相同的用户,角色和数据库。

不同于article在线订购描述普通的"只收费"部署,本文将探讨用于部署 LightSwitch应用程序的技术,该应用程序包含其他应用程序。 在本文中,将使用 ,但是这里的所有内容都可以在任何 ASP.NET 应用程序中。

集成的关键是使用的iframe工具。

需求

在本示例中,我们将创建满足以下要求的应用程序:

  • 允许注册用户 ( 海报 ),可以创建他们出售的物品的Posts,无需邮寄电子邮件地址。
  • 允许匿名用户 ( 买家 ) 查看帖子,无需他们在安装的Silverlight插件中安装
  • 允许的买家回复的邮件,并自动发送的海报
  • 允许海报查看和回应所有的通讯,以收费的邮政 sorted
  • 允许管理员编辑所有数据的能力

这可能不是一个大应用程序,但是需要花费几天的时间。 你可以在大约一个小时内创建整个应用程序,以,。

通过'销售的东西'应用程序进行漫游

你可以在这里链接中试用 live 应用程序 applicationhttp://lightswitchhelpwebsite.com/Demos/ThingsForSale.aspx

当你没有登录时,你将看到你可以浏览的帖子的列表。

你可以点击一个收费的帖子来发送海报。

登录时,可以创建帖子,并查看与邮件相关的任何邮件。

另外,还有很多其他特性,如并发检查自动椭圆 implements自动实现 implements。

创建应用程序

你可以从此链接下载的LightSwitch:

http://www.microsoft.com/visualstudio/en-us/lightswitch

安装后,使用 File,项目创建一个收费的LightSwitch应用程序。

双击 Solution Solution解决方案资源管理器中的 Properties Properties。

将应用程序设置为收费的网页应用程序。

设置为使用表单身份验证

类别 table 和屏幕

在一分钟内,创建一个 table 类别和一个屏幕来编辑它们,这是一个任务。

右键单击解决方案资源管理器中的数据源 Sources,然后选择 Add Add。

单击 table NAME 以更改 NAME。 为名称输入类别

在上面创建 table。

右键点击屏幕,然后选择添加屏幕。

使用类别 ( LightSwitch自动'pluralizes'表的NAME ) 创建收费的可以编辑网格屏幕筛选器。

屏幕将显示。

以运行应用程序。

我们现在可以在应用程序中创建类别

关闭网页浏览器以停止应用程序。

创建剩余的表

使用上面的架构创建一个收费的帖子。

使用上面的架构创建消息 table。

创建关系

打开邮件 table,并单击 Relationship Relationship button。

添加新关系框中,输入上设置。

打开的表格。

添加新关系框中,输入上设置。

关系已经完成。

设置关系对于非常重要。 它允许重要功能,比如允许创建屏幕,在的帖子和的邮件related总是保持同步,而不需要任何代码。

对于任何收费的实体 ( 表格),都不需要与一个或者多个其他实体关系。

在记录创建时设置默认值

打开邮件 table,并选择编写代码,然后消息 Created。

将该方法更改为:


 partial void Message_Created()


{


 this.MessageCreated = DateTime.UtcNow;


}




这将在创建邮件时设置邮件的日期。 注意,我们使用" UtcNow",以便将时间记录在协调通用时间( UTC ) 时间。 显示时间时,可以将它的转换为用户时间的本地。

打开 Post table,并选择编写代码,然后更新。

将该方法更改为:


 partial void Posts_Updating(Post entity)


{


 entity.PostUpdated = DateTime.UtcNow;


}




打开 Post table,并选择编写代码,然后创建的。

将该方法更改为:


 partial void Post_Created()


{


 this.PostedBy = this.Application.User.Name;


 this.PostCreated = DateTime.UtcNow;


 this.PostUpdated = DateTime.UtcNow;


 this.Active = true;


}




注释行:





this.PostedBy = this.Application.User.Name;



这就是按用户分割数据所需的全部。

在运行时,将为" 。application。name name"提供用户名,将提供用户名。

我们将在后面的步骤中使用 PreProcess PreProcess查询来限制用户只查看自己的帖子 ( 邮件 )。

发送电子邮件

这里应用程序将要求发送电子邮件。 现在让我们启用这个功能。

为此,我们需要 switch 以收费文件视图

服务器项目中,添加对 System.configuration 和的引用。

服务器项目的UserCode UserCode文件夹添加名为 MailHelper.cs的类别。

使用下面的代码:


// Adapted from:


// http://www.paulspatterson.com/technology/lightswitch/


// microsoft-lightswitch-sending-emails-from-the-client/#more-2896



using System.Net;


using System.Net.Mail;


using System.Configuration;


using System;



namespace LightSwitchApplication


{


 public class MailHelper


 {


 private string _SMTPSendingEmailAddress { get; set; }


 private string _SMTPServer { get; set; }


 private string _SMTPUserId { get; set; }


 private string _SMTPPassword { get; set; }


 private int _SMTPPort { get; set; }


 private bool _SMTPSSL { get; set; }



 private string _MailFromName { get; set; }


 private string _MailToEmail { get; set; }


 private string _MailToName { get; set; }


 private string _MailSubject { get; set; }


 private string _MailBody { get; set; }



 public MailHelper(


 string SendFromName, string SendToEmail,


 string SendToName, string Subject,


 string Body)


 {


 _MailFromName = SendFromName;


 _MailToEmail = SendToEmail;


 _MailToName = SendToName;


 _MailSubject = Subject;


 _MailBody = Body;



 _SMTPSendingEmailAddress = Convert.ToString(ConfigurationManager.AppSettings["SMTPSendingEmailAddress"]);


 _SMTPServer = Convert.ToString(ConfigurationManager.AppSettings["SMTPServer"]);


 _SMTPUserId = Convert.ToString(ConfigurationManager.AppSettings["SMTPUserID"]);


 _SMTPPassword = Convert.ToString(ConfigurationManager.AppSettings["SMTPPassword"]);


 _SMTPPort = Convert.ToInt32(ConfigurationManager.AppSettings["SMTPPort"]);


 _SMTPSSL = Convert.ToBoolean(ConfigurationManager.AppSettings["SMTPSSL"]);


 }



 public void SendMail()


 {


 MailMessage mail = new MailMessage();



 System.Net.Mail.MailAddress mailFrom =


 new System.Net.Mail.MailAddress(_SMTPSendingEmailAddress, _MailFromName);



 System.Net.Mail.MailAddress mailTo =


 new System.Net.Mail.MailAddress(_MailToEmail, _MailToName);



 var _with1 = mail;


 _with1.From = mailFrom;


 _with1.To.Add(mailTo);


 _with1.Subject = _MailSubject;


 _with1.Body = _MailBody;



 SmtpClient smtp = new SmtpClient(_SMTPServer, _SMTPPort);


 smtp.EnableSsl = _SMTPSSL;



 smtp.Credentials =


 new NetworkCredential(_SMTPUserId, _SMTPPassword);



 smtp.Send(mail);


 }


 }


}



解决方案资源管理器,中单击项目 NAME,然后选择显示所有文件

这将使你看到收费的ServerGenerated项目。

这个项目是通过创建的,当作为web应用程序部署时使用。 我们最终将放置将生成HTML页面的文件。 目前,我们只想向收费的Web.config 添加一些条目

这将允许我们在部署应用程序时轻松更改邮件服务器设置。

switch 返回到收费的逻辑视图。

打开邮件 table,然后选择 Messages_Inserted method。

对方法( 发送电子邮件) 使用以下代码:

#region Messages_Insertedpartialvoid Messages_Inserted(Message entity)
{
 string strSubject = "Message From ThingsForSale";
 string strMessage = String.Format("{0}",
 "This is a message From the Things For Sale program.")
 + Environment.NewLine + Environment.NewLine;
 strMessage = strMessage + String.Format("Regarding the post '{0}'",
 entity.Post.Description) + Environment.NewLine;
 strMessage = strMessage + String.Format("This message was sent by {0}",
 entity.NameFrom) + Environment.NewLine + Environment.NewLine;
 strMessage = strMessage + String.Format("Message: {0}",
 entity.MessageText) + Environment.NewLine;
 // Create the MailHelper class created in the Server project. MailHelper mailHelper =
 new MailHelper(
 entity.NameFrom,
 entity.EmailTo,
 entity.NameTo,
 strSubject,
 strMessage);
 // Send Email mailHelper.SendMail();
}#endregion

创建帖子和邮件屏幕

解决方案 Explorer Explorer右击右击屏幕上的节点并选择添加屏幕。

创建一个收费的清单和详细的。

注意:因为我们创建了表之间的关系,所以我们可以在同一屏幕上,通过简单地检查一个框来启用和消息

屏幕会显示。

运行该应用程序时,你将可以输入 Posts Posts的邮件

将应用程序部署到DotNetNuke网站

按照这里的方向将应用程序部署到 DotNetNUke网站:轻松越冬地区LightSwitch部署计划。

我们现在有了基本布局图 上面。 这里用户可以使用 IFrame IFrame应用程序,以为代价的数据库连接,以为代价的数据库连接,以为代价的DotNetNuke DotNetNuke站点,并共享用户身份验证。

对于许多应用程序来说,这。 对于我们的示例,我们需要确定用户是否是管理员,因为我们希望为管理员提供额外的功能。

我们可以简单地将用户和角色表添加到的LightSwitch应用程序中,但我发现这有时会导致用户 table 锁定( 有关更多信息,请参见链接 )。

添加的WCF RIA服务可以防止任何锁定问题。

创建 WCF RIA服务

( 说明:你必须拥有 Visual Studio 专业 或者更高,以执行以下步骤)

有关创建WCF服务的官方信息,请参见 ( 这里链接)

添加项目

创建一个新的收费

右键单击 创建的Class1.cs 文件,并将。

添加一个的实体数据模型

连接到 DotNetNuke数据库。

通常,我们只需要添加的vw_UserRoles视图来确定用户是管理员还是不需要。

不过,我们还将添加类别,邮寄 Post Message消息,因为我们也将在以后的步骤中使用Entity的实体数据模型。

项目

添加域名服务类

我们只需要的域名服务类中的 另外,如果我们不需要它,我们可以使用来启用客户端访问。

将创建域服务类

将 [Query(IsDefault = true)] 添加到方法( 自动创建的) 顶部。

保存文件and生成解决方案。

右键单击数据源,然后选择Add数据源。

选择 WCF服务 and并单击。

( 如果这个盒子消失了,而且很长时间没有任何事情发生,请不要惊讶。 另外,该框现在可以隐藏 behind Visual Studio 主窗口)

单击添加参考

选择项目,并单击 ok。

等待域服务 Class 出现在列表框中。 有时可能需要 1 -2分钟。

出现时,选择它,然后单击

选中要使用的实体( 在本例中我们要使用的vw_UserRoles )

请不要输入任何连接字符串,因为我们将把它设置为手动的Web.config。

单击完成

数据源将显示。

的连接字符串从数据项目的App.config Copy。

将文件视图,并打开 Web.config,并添加的连接字符串。

使用 WCF RIA服务

要演示如何使用新的WCF服务,打开EditableCategoriesGrid屏幕,并选择 EditableCategoriesGrid_CanRun event事件。

将该方法更改为以下代码:


partial void EditableCategoriesGrid_CanRun(ref bool result)


{


 // Must be an Administrator for this link to show


 var WorkSpace = this.CreateDataWorkspace();



 var UserInRole = (from DNNUser in WorkSpace.DNNDomainServiceData.vw_UserRoles


 where DNNUser.Username == this.User.Name


 where DNNUser.RoleName == "Administrators"


 select DNNUser).FirstOrDefault();



 result = (UserInRole!= null);


}




点击解决方案资源管理器中的项目。

这将允许你选择发布

发布应用程序

我们将在 Easy-DotNetNuke LightSwitch部署过程中redo你对 Web.Config 所作的所有更改,因为我们在创建的WCF RIA服务时添加了 web.config。

当你在 DotNetNuke网站上运行应用程序时,只有管理员会看到链接,以编辑收费的类别

使用预处理查询启用安全性

其中一个要求是管理员可以看到所有收费的帖子,但非管理员只能看到他们自己的帖子。

打开个帖子 Entity,并选择张贴所有的PreprocessQuery。

将代码更改为以下内容:


 partial void Posts_All_PreprocessQuery(ref IQueryable<Post> query)


{


 // Only run this PreProcess Query if user is Authenticated


 if (this.Application.User.IsAuthenticated)


 {


 string UserName = this.Application.User.Name;



 // Connect to DotNetNuke Data


 var WorkSpace = this.Application.CreateDataWorkspace();



 var UserInRole = (from DNNUser in WorkSpace.DNNDomainServiceData.vw_UserRoles


 where DNNUser.Username == UserName


 where DNNUser.RoleName == "Administrators"


 select DNNUser).FirstOrDefault();



 // If User is not an Administrator


 // The User can only see their own posts


 if (UserInRole == null)


 {


 query = query.Where(x => x.PostedBy == this.Application.User.Name);


 }


 }


}




模态 Windows ( 弹出窗口)

费费模式 Windows ( 也称为 Popups ) 是重要的收费用户界面工具,因为需要用户在完成任务之前先完成任务设置。

在这个示例应用程序中,我们希望弹出Popups以显示用户查看现有的邮件或者响应邮件。

还有其他收费的Popups,但是它们是自动创建的,

目前,当存在消息时,它会显示像上面的图像一样的所有字段。

我们希望的弹出像上面的图片一样。

为此,我们将制作自己的弹出菜单,然后重写打开当前弹出菜单的代码,打开我们的弹出菜单。

选择 screen designer Details Details Details Details Details Add Add Messages邮件 Messages Messages Messages Messages Messages。

它会显示出来。

将节更改为模式窗口

将所有的 Change Change Labels Labels Labels Labels delete。

选择模式窗口,并注意窗口的NAME。 取消选中显示按钮框。

点击收费信息网格,展开命令栏,右键单击 Edit Edit按钮,然后选择覆盖代码 Override。

将代码更改为以下内容:


 partial void MessagesEditSelected_Execute()


{


 this.OpenModalWindow("Messages_SelectedItem");


}




现在如果我们选择编辑按钮,它会打开我们定制的Popup。

在下一步中,我们将添加一个响应按钮,这样可以实际创建一个消息,作为对在HTML页面( 在以后的步骤中创建) 中输入的消息的响应。

注意:要了解下一步,建议你阅读: 这就是LightSwitch如何实现MVVM的方式。

客户项目中,以为代价的文件视图,并添加收费的参考,以的。

选择添加数据项。

创建一个收费为的Local本地属性,并将它的命名为 Message_Response。

它将显示在"屏幕收费模型视图"上( 请参见: 这就是LightSwitch如何实现MVVM的一个解释视图模型的解释。

选择 Details Details,然后将消息响应属性添加到屏幕。

将它的改为模式窗口

这些属性将会显示。

  • 除了 Remove Remove Remove Remove邮件Text邮件Text邮件文本
  • 名称改为
  • 在Modal模式窗口的属性中,取消选中显示按钮

模式窗口的Command命令栏中添加一个按钮,并将它的称为 SaveResponse。

按钮的属性中,将显示名称改为 Save Message Message Message Message。

右键单击 按钮,然后选择执行代码 Edit

将代码更改为:

#region SaveResponse_Executepartialvoid SaveResponse_Execute()
{
 this.CloseModalWindow("Message_Response");
 this.Save();
}#endregion

将对象树向上导航到 Messages Messages Messages Messages Messages Messages,并删除Add按钮,并添加一个按钮

把它叫做 RespondToMessage

将它拖到其他两个按钮的顶部,右键单击右键右键单击它并选择 Edit执行代码

使用以下代码创建新的邮件并打开弹出 Popup,同时检测关闭 Popup ( 当点击弹出右上角的x 时),并删除所有未保存的邮件

#region RespondToMessage_Executepartialvoid RespondToMessage_Execute()
{
 // Create a new Message Message_Response = new Message();
 //Set the Post Message_Response.Post = Posts.SelectedItem;
 // Set Email defaults Message_Response.MessageBy = this.Application.User.Name;
 // these values are from the currently selected Message Message_Response.NameFrom = Messages.SelectedItem.NameTo;
 Message_Response.EmailFrom = Messages.SelectedItem.EmailTo;
 Message_Response.NameTo = Messages.SelectedItem.NameFrom;
 Message_Response.EmailTo = Messages.SelectedItem.EmailFrom;
 this.OpenModalWindow("Message_Response");
 // Wire up an event to detect when the Modal window is closedthis.FindControl("Message_Response").ControlAvailable +=
 new EventHandler<ControlAvailableEventArgs>(PostsListDetail_ControlAvailable);
}#endregion#region PostsListDetail_ControlAvailablevoid PostsListDetail_ControlAvailable(object sender, ControlAvailableEventArgs e)
{
 ChildWindow window = (ChildWindow)e.Control;
 window.Closed += new EventHandler(Message_Response_Closed);
}#endregion#region Message_Response_Closedvoid Message_Response_Closed(object sender, EventArgs e)
{
 ChildWindow window = (ChildWindow)sender;
 if (!(window.DialogResult.HasValue))
 {
 // Remove unsaved recordsforeach (Message message inthis.DataWorkspace.ApplicationData.Details.GetChanges()
. AddedEntities.OfType<Message>())
 {
 message.Details.DiscardChanges();
 }
 }
}#endregion

你还需要在类顶部添加

创建HTML页面

switch 到文件视图

向项目添加一个对 System.configuration的引用。

向 code PublicPage.aspx 添加一个名为的页,并使用以下代码为代码 behind ( 请从下载中获取的HTML 代码):


using DNNData;


using System;


using System.Collections.Generic;


using System.Configuration;


using System.Linq;


using System.Text.RegularExpressions;


using System.Transactions;


using System.Web.UI;


using System.Web.UI.WebControls;


using LightSwitchApplication;



namespace ApplicationData.Implementation


{


 public partial class PublicPage : System.Web.UI.Page


 {


 
#region CurrentPagepublicint CurrentPage
 {
 get {
 if (ViewState["CurrentPage"] == null)
 {
 return1;
 }
 else {
 return (int)ViewState["CurrentPage"];
 }
 }
 set {
 ViewState["CurrentPage"] = value;
 }
 }
 #endregion#region CurrentPostIDpublicint CurrentPostID
 {
 get {
 if (ViewState["CurrentPostID"] == null)
 {
 return -1;
 }
 else {
 return (int)ViewState["CurrentPostID"];
 }
 }
 set {
 ViewState["CurrentPostID"] = value;
 }
 }
 #endregionprotectedvoid Page_Load(object sender, EventArgs e)
 {
 if (!Page.IsPostBack)
 {
 GetPosts(true, CurrentPage);
 }
 }
 #region GetPostsprivatevoid GetPosts(bool FillCategories, int intPage)
 {
 // Collections to hold the final results List<DNNData.Category> lstCategories = new List<DNNData.Category>();
 // Connect to DotNetNuke Datastring _IntrinsicData = Convert.ToString(ConfigurationManager.ConnectionStrings["DotNetNuke5Entities"]);
 DotNetNuke5Entities db = new DotNetNuke5Entities(_IntrinsicData);
 int intCategoryID = -1;
 // Get selected categoryif (!FillCategories)
 {
 intCategoryID = Convert.ToInt32(ddlCategories.SelectedValue);
 }
 if (FillCategories)
 {
 // execute queryvar colCatagories = (from Cat in db.Categories
 select Cat).ToList();
 // Add an All option DNNData.Category objCategory = new DNNData.Category();
 objCategory.Id = -1;
 objCategory.CategoryName = "All";
 lstCategories.Add(objCategory);
 // Add Categoriesforeach (var item in colCatagories)
 {
 lstCategories.Add(item);
 }
 // We now have the results - bind then to the dropdown ddlCategories.DataSource = lstCategories;
 ddlCategories.DataBind();
 }
 // Get Posts// create queryvar colPosts = from PST in db.Posts
 select PST;
 // Get active posts colPosts = colPosts.Where(x => x.Active == true);
 // Get Categoryif (intCategoryID!= -1)
 {
 colPosts = colPosts.Where(x => x.Category.Id == intCategoryID);
 }
 // Do paging colPosts =
 colPosts.OrderByDescending(x => x.PostUpdated).
 Skip(((intPage - 1) * 10)).Take(10);
 // We now have the results - bind then to the dropdown gvPosts.DataSource = colPosts;
 gvPosts.DataBind();
 }
 #endregion#region ddlCategories_SelectedIndexChangedprotectedvoid ddlCategories_SelectedIndexChanged(object sender, EventArgs e)
 {
 pnlMessage.Visible = false;
 GetPosts(false, CurrentPage);
 }
 #endregion#region btnLeft_Clickprotectedvoid btnLeft_Click(object sender, EventArgs e)
 {
 pnlMessage.Visible = false;
 if (CurrentPage >1)
 {
 CurrentPage--;
 }
 GetPosts(false, CurrentPage);
 }
 #endregion#region btnRight_Clickprotectedvoid btnRight_Click(object sender, EventArgs e)
 {
 pnlMessage.Visible = false;
 if (gvPosts.Rows.Count >0)
 {
 CurrentPage++;
 }
 GetPosts(false, CurrentPage);
 }
 #endregion#region gvPosts_RowCommandprotectedvoid gvPosts_RowCommand(object sender, GridViewCommandEventArgs e)
 {
 LinkButton lnkButtton = (LinkButton)e.CommandSource;
 CurrentPostID = Convert.ToInt32(lnkButtton.CommandArgument);
 pnlMessage.Visible = true;
 }
 #endregion#region btnSubmit_Clickprotectedvoid btnSubmit_Click(object sender, EventArgs e)
 {
 try {
 Transaction currentTrx = Transaction.Current;
 Transaction.Current = null;
 // Validateif (!IsValidEmail(txtEmail.Text))
 {
 lblError.Text = "Must use a valid Email";
 return;
 }
 if (txtEmail.Text.Count() <1)
 {
 lblError.Text = "Must enter a message";
 return;
 }
 if (txtEmail.Text.Count() >255)
 {
 lblError.Text = "Message must be less than 255 characters";
 return;
 }
 // Connect to DotNetNuke Datastring _IntrinsicData = Convert.ToString(ConfigurationManager.ConnectionStrings["DotNetNuke5Entities"]);
 DotNetNuke5Entities db = new DotNetNuke5Entities(_IntrinsicData);
 // Get the information for the user who made the Postvar DNNUser = (from PST in db.Posts
 from vw_Users in db.vw_UserRoles
 where PST.PostedBy == vw_Users.Username
 where PST.Id == CurrentPostID
 select vw_Users).FirstOrDefault();
 // Create New Message DNNData.Message NewMessage = new DNNData.Message();
 NewMessage.NameFrom = txtName.Text;
 NewMessage.EmailFrom = txtEmail.Text;
 NewMessage.NameTo = DNNUser.DisplayName;
 NewMessage.EmailTo = DNNUser.Email;
 NewMessage.MessageText = txtMessage.Text;
 NewMessage.MessageCreated = DateTime.UtcNow;
 NewMessage.Message_Post = CurrentPostID;
 db.AddToMessages(NewMessage);
 db.SaveChanges();
 // Get the information for the Postvar PostInfo = (from PST in db.Posts
 where PST.Id == CurrentPostID
 select PST).FirstOrDefault();
 // Send Emailstring strSubject = "Message From ThingsForSale";
 string strMessage = String.Format("{0}",
 "This is a message From the Things For Sale program.")
 + Environment.NewLine + Environment.NewLine;
 strMessage = strMessage + String.Format("Regarding the post '{0}'",
 PostInfo.Description) + Environment.NewLine;
 strMessage = strMessage + String.Format("This message was sent by {0}",
 txtName.Text) + Environment.NewLine + Environment.NewLine;
 strMessage = strMessage + String.Format("Message: {0}",
 txtMessage.Text) + Environment.NewLine;
 // Create the MailHelper class created in the Server project. MailHelper mailHelper =
 new MailHelper(
 txtName.Text,
 DNNUser.Email,
 DNNUser.DisplayName,
 strSubject,
 strMessage);
 // Send Email mailHelper.SendMail();
 lblError.Text = "Success";
 // Clear fields txtMessage.Text = "";
 }
 catch (Exception ex)
 {
 lblError.Text = ex.Message;
 }
 }
 #endregion#region IsValidEmailpublicstaticbool IsValidEmail(string strIn)
 {
 // Return true if strIn is in valid e-mail format.// From: http://msdn.microsoft.com/en-us/library/01escwtf.aspxreturn Regex.IsMatch(strIn,
 @"^(?("")("".+?""@)|(([0-9a-zA-Z]((.(?!.))|[-!#$%&'*+/=?^`{}|~w])*)(?<=[0-9a-zA-Z])@))" +
 @"(?([)([(d{1,3}.){3}d{1,3}])|(([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+[a-zA-Z]{2,6}))$");
 }
 #endregion }
}

在LightSwitch中创建指向HTML页面的链接

客户项目中添加一个参考,以收费的System.Windows.Browser

switch 至收费的逻辑视图。

添加屏幕。

添加一个收费为 PublicPage的新数据屏幕,没有屏幕数据 selected。

选择 PublicPage_Run 方法。

将它的更改为以下代码:


partial void PublicPage_Run(ref bool handled)


{


 // Set handled to 'true' to stop further processing.


 Dispatchers.Main.Invoke(() =>


 {


 HtmlPage.Window.Navigate(new Uri("PublicPage.aspx", UriKind.Relative));


 });



 handled = true;


}




你还需要将以下语句添加到该类中:

使用进行收费;
使用 System.Windows.Browser;

我们需要在构建文件中公布的PublicPage.aspx,这样将在构建中包含它。

注意:在执行以下步骤之前,需要备份整个解决方案:

项目视图 switch,右键单击 LightSwitch Project Project项目,然后选择卸载项目。

右键单击卸载的项目右键单击并选择 Edit。

将以下内容添加到 _buildFile 部分的底部:


<_BuildFile Include="ServerGeneratedPublicPage.aspx">


 <SubFolder>


 </SubFolder>


 <PublishType>


 </PublishType>


 </_BuildFile>




重新加载项目。

现在你可以运行项目并点击的public 页面链接。

。并导航到HTML页面。

在你的应用程序中,你将希望为未认证的用户提供的HTML 页面。

在 LightSwitchHelpWebsite 上的演示,只有一个 ,直接指向收费的PublicPage.aspx,并且只显示给未经过身份验证的用户。 第二个收费的IFrame,只为注册用户启用,显示了普通的应用程序的收费。

完成触摸

Posts screen上,删除由发布的,因为它以编程方式被设置

但是,注意它仍然会出现在自动创建弹出菜单上。

Post中打开 Entity,并选择PostedBy字段,然后在默认情况下选中显示。

弹出不再显示字段。

邮件数据网格设置为 use use use use use use use use

选择 CanExecute CanExecute代码,以获取邮件按钮。

将代码更改为以下内容:

#region RespondToMessage_CanExecutepartialvoid RespondToMessage_CanExecute(refbool result)
{
 // Must have a Message Selected result = (Messages.SelectedItem!= null);
}#endregion

邮件编辑按钮执行相同的操作。

这将导致在没有选择邮件时禁用按钮。

将项目的Properties属性 Go Go设置为 Post startup屏幕,作为启动屏幕。

高级LightSwitch应用程序

这展示了一个高级的应用程序。 然而,对于LightSwitch仍然有更多的内容。 例如可以使用自定义控件控件来控制整个 UI。

这里有很多教程,提示,博客和论坛:

http://LightSwitchHelpWebsite.com


WEB  INT  Light  网站  Visual Studio  lights  
相关文章