用c#开发微信 (17) 微活动 3 投票活动 (文本投票)
前面介绍了微活动《大转盘》 和 《刮刮卡》,这次介绍下微投票,微投票分二种,一种是文本投票, 一种是图片投票。
下面介绍文本投票的详细步骤:
1. 新建文本投票活动

- 代码实现:
<div class="tab-content" >
<dl>
<dt>投票标题:</dt>
<dd>
<asp:TextBox runat="server" ID="title" CssClass="input normal" datatype="*1-100" sucmsg=" " nullmsg=" "></asp:TextBox>
<span class="Validform_checktip">*</span>
</dd>
</dl>
<dl>
<dt >投票图片:</dt>
<dd>
<asp:TextBox runat="server" CssClass="input normal upload-path" ID="votepic"></asp:TextBox>
<div class="upload-box upload-img"></div>
</dd>
</dl>
<dl>
<dt>
图片显示:
</dt>
<dd>
<div class="rule-multi-radio">
<asp:RadioButtonList ID="picdisplay" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Value="True" Selected="True">显示在投票页面</asp:ListItem>
<asp:ListItem Value="False" >不显示在投票页面</asp:ListItem>
</asp:RadioButtonList>
</div>
</dd>
</dl>
<dl>
<dt>投票说明:</dt>
<dd>
<textarea name="txtactContent" rows="2" cols="20" id="txtactContent" class="input" runat="server"></textarea>
<span class="Validform_checktip"></span>
</dd>
</dl>
<dl>
<dt>单选/多选:</dt>
<dd>
<div class="rule-multi-radio">
<asp:RadioButtonList ID="Radio" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Value="True" Selected="True">单选</asp:ListItem>
<asp:ListItem Value="False" >多选</asp:ListItem>
</asp:RadioButtonList>
</div>
</dd>
</dl>
<dl>
<dt>截止时间:</dt>
<dd>
<div class="input-date">
<asp:TextBox runat="server" ID="begindate" CssClass="input date" onfocus="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" datatype="*1-50" errormsg="请选择正确的日期" sucmsg=" " nullmsg=" "></asp:TextBox>
</div>
到
<div class="input-date">
<asp:TextBox runat="server" ID="enddate" CssClass="input date" onfocus="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" datatype="*1-50" errormsg="请选择正确的日期" sucmsg=" " nullmsg=" "></asp:TextBox>
</div>
<span class="Validform_checktip">*</span>
</dd>
</dl>
<dl>
<dt>投票结果:</dt>
<dd>
<div class="rule-multi-radio">
<asp:RadioButtonList ID="resultShowtype" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Value="1" Selected="True" >投票前可见</asp:ListItem>
<asp:ListItem Value="2" >投票后可见</asp:ListItem>
<asp:ListItem Value="3" >投票结束可见</asp:ListItem>
</asp:RadioButtonList>
</div>
</dd>
</dl>
<dl style="display:none">
<dt>投票后参加活动:</dt>
<dd>
<asp:TextBox runat="server" CssClass="input normal upload-path" ID="actUrl"></asp:TextBox>
</dd>
</dl>
</div>
2. 设置投票的选项

- 代码实现:
<div class="tab-content" style="display: none">
<dl>
<dt>选项标题</dt>
<dd>选项标题:<asp:TextBox ID="xuanxtitle1" runat="server" CssClass="input " datatype="*1-100" sucmsg=" " Text="" />
排序:<asp:TextBox ID="Sortid1" runat="server" CssClass="input small" datatype="n" sucmsg=" " Text="" nullmsg=" " />
<span class="Validform_checktip">*必填项</span>
</dd>
</dl>
<dl>
<dt>选项标题</dt>
<dd>选项标题:<asp:TextBox ID="xuanxtitle2" runat="server" CssClass="input " datatype="*1-20" sucmsg=" " Text="" />
排序:<asp:TextBox ID="Sortid2" runat="server" CssClass="input small " datatype="n" sucmsg=" " Text="" nullmsg=" " />
<span class="Validform_checktip">*必填项</span>
</dd>
</dl>
<dl>
<dt>选项标题</dt>
<dd>选项标题:<asp:TextBox ID="xuanxtitle3" runat="server" CssClass="input " datatype="*0-100" sucmsg=" " Text="" />
排序:<asp:TextBox ID="Sortid3" runat="server" CssClass="input small" datatype="/^\d*$/" sucmsg=" " Text="" />
</dd>
</dl>
<dl>
<dt>选项标题</dt>
<dd>选项标题:<asp:TextBox ID="xuanxtitle4" runat="server" CssClass="input " datatype="*0-100" sucmsg=" " Text="" />
排序:<asp:TextBox ID="Sortid4" runat="server" CssClass="input small" datatype="/^\d*$/" sucmsg=" " Text="" />
</dd>
</dl>
<dl>
<dt>选项标题</dt>
<dd>选项标题:<asp:TextBox ID="xuanxtitle5" runat="server" CssClass="input " datatype="*0-100" sucmsg=" " Text="" />
排序:<asp:TextBox ID="Sortid5" runat="server" CssClass="input small" datatype="/^\d*$/" sucmsg=" " Text="" />
</dd>
</dl>
<dl>
<dt>选项标题</dt>
<dd>选项标题:<asp:TextBox ID="xuanxtitle6" runat="server" CssClass="input " datatype="*0-100" sucmsg=" " Text="" />
排序:<asp:TextBox ID="Sortid6" runat="server" CssClass="input small" datatype="/^\d*$/" sucmsg=" " Text="" />
</dd>
</dl>
</div>
3. 设置完成后出现在列表里
4. 把上面生成的外链代码发送给微信用户
用户收到投票的消息,点击进入后就可以投票了

代码实现:
- 前台显示
<div class="vote">
<form class="form" target="_top" runat="server" enctype="multipart/form-data">
<div class="votecontent">
<h2><%=baseinfo.title %></h2>
<span class="date"><%=baseinfo.creatDate.Value.ToString("yyyy-MM-dd") %></span>
<p class="content" id="content"><%=baseinfo.votecontent %></p>
<script src="js/play.js" type="text/javascript"></script>
<p class="modus">单选投票,<span class="number">共有<%=toupNum %>参与投票</span></p>
<ul class="list" id="list">
<asp:Literal ID="litChooes" runat="server"></asp:Literal>
<asp:Literal ID="litMessageList" runat="server" EnableViewState="false"></asp:Literal>
</ul>
<asp:Literal ID="litSubmitBtn" runat="server" EnableViewState="false"></asp:Literal>
<input class="pxbtn" name="button" runat="server" type="button" id="btnSubmit" value="确认提交">
</div>
</form>
</div>
- 后台绑定数据:
public void BindData(int wid, int aid, string openid)
{
//基本表信息
BLL.wx_vote_base baseBll = new BLL.wx_vote_base();
List<Model.wx_vote_base> mlist = baseBll.GetModelList(string.Format(" id={0} and wid={1} ", aid, wid));
if (mlist.Count <= 0 || mlist == null)
{
return;
}
baseinfo = mlist[0];
//投票选项字符串设置
BLL.wx_vote_item itemBll = new BLL.wx_vote_item();
IList<Model.wx_vote_item> itemlist = itemBll.GetModelList("baseid=" + baseinfo.id);
if (itemlist == null || itemlist.Count <= 0)
{
return;
}
ItemListStr(itemlist, openid);
}
public void ItemListStr(IList<Model.wx_vote_item> itemlist, string openid)
{
toupNum = itemlist.Sum(i => i.tpTimes == null ? 0 : i.tpTimes).Value;
BLL.wx_vote_result retBll = new BLL.wx_vote_result();
IList<Model.wx_vote_result> retList = retBll.GetModelList("baseid=" + baseinfo.id);
//投票总数
// int ttCount = retList == null ? 0 : retList.Count;
//toupNum = retBll.GetVotedPersonNum(baseinfo.id);
int itemCount = 0;
float bfb = 0;
hasVoted = false;
bool showReult = false;
//判断这个人是否已经投票了
IList<Model.wx_vote_result> myretList = (from r in retList where r.openId == openid select r).ToArray<Model.wx_vote_result>();
if (myretList != null && myretList.Count > 0)
{
hasVoted = true;
}
//判断是否显示结果
if (baseinfo.resultShowtype == 1)
{
showReult = true;
}
else if (baseinfo.resultShowtype == 2 && hasVoted)
{
showReult = true;
}
else if (baseinfo.resultShowtype == 3 && baseinfo.endTime <= DateTime.Now)
{
showReult = true;
}
StringBuilder sb = new StringBuilder();
StringBuilder choose = new StringBuilder();
Model.wx_vote_item item = new Model.wx_vote_item();
for (int i = 0; i < itemlist.Count; i++)
{
item = itemlist[i];
itemCount = item.tpTimes == null ? 0 : item.tpTimes.Value;
bfb = computeBL(toupNum, itemCount);
sb.Append("<li>");
if (showReult)//投票了
{
sb.Append(" <label for=\"square-checkbox-" + i + "\">");
if (!showReult || (baseinfo.resultShowtype == 1 && !hasVoted))
{
sb.Append("<input class=\"ckbx\" tabindex=\"9\" name=\"id[]\" value=\"" + (i + 1) + "\" type=\"radio\" id=\"square-checkbox-" + i + "\">");
}
sb.Append(" <span>" + item.title + "</span>");
sb.Append(" </label>");
sb.Append(" <div id=\"voteshow" + i + "\" class=\"votebar\">");
sb.Append(" <div class=\"pbg\">");
sb.Append(" <div style=\"width: " + bfb + "%; background-color:" + bkColor(i) + "\" class=\"pbr\"></div>");
sb.Append(" </div>");
sb.Append(" <span class=\"percentage\" style=\"color: " + bkColor(i) + "\">" + bfb + "%<span class=\"user\">(" + itemCount + ")</span></span>");
sb.Append(" </div>");
}
else
{
sb.Append(" <label for=\"square-checkbox-" + i + "\">");
if (!showReult || (baseinfo.resultShowtype == 1 && !hasVoted))
{
sb.Append(" <input class=\"ckbx\" tabindex=\"9\" name=\"id[]\" value=\"" + (i + 1) + "\" type=\"" + chektype() + "\" id=\"square-checkbox-" + i + "\">");
}
sb.Append(" <span>" + item.title + "</span>");
sb.Append(" </label>");
}
sb.Append(" </li>");
}
if (hasVoted)
this.btnSubmit.Visible = false;
if (baseinfo.resultShowtype == 3 && baseinfo.endTime > DateTime.Now && hasVoted)
{
Response.Redirect("tp_result.aspx");
}
litMessageList.Text = sb.ToString();
}
投票成功后提示

- 投票成功
<script>
$(document).ready(function () {
$(".ckbx").click(function () {
var i = 0;
var aa = document.getElementsByName('id[]');
var mnum = aa.length;
j = 0;
for (i = 0; i < mnum; i++) {
if (aa[i].checked) {
j++;
}
}
if (j > 2) {
$(this).attr("checked", false);
}
});
});
$(document).ready(function () {
var isradio = $('input:radio[class="ckbx"]:checked').val();
$("#btnSubmit").click(function () {
var wid = $.query.get("wid");
var openid = $.query.get("openid");
var aid = $.query.get("aid");
var selectItemid = "";
if (isradio == "true") {
var list = $('input:radio[class="ckbx"]:checked').val();
if (list == null) {
alert("请选中一个!");
return false;
}
else {
selectItemid = list;
}
}
else {
$('input[class="ckbx"]:checked').each(function () {
selectItemid += $(this).val() + ',';
});
if (selectItemid == "") {
alert("请选中一个!");
return;
}
if (selectItemid.length > 0) {
selectItemid = selectItemid.substring(0, selectItemid.length - 1);
}
}
var submitData = {
wid: wid,
openid: openid,
baseid: aid,
itemid: selectItemid,
isradio: isradio,
myact: "commit"
};
$.post('vote.ashx', submitData,
function (data) {
if (data.ret == "ok") {
alert(data.content);
window.location.href = location.href;
} else { alert(data.content); }
},
"json")
});
});
</script>
- 插入DB:
public class vote : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/json";
string _action = MyCommFun.QueryString("myact");
string openid = MyCommFun.RequestOpenid(); //得到微信用户的openid
Dictionary<string, string> jsonDict = new Dictionary<string, string>();
if (_action == "commit")
{ //提交投票
int wid = MyCommFun.RequestInt("wid");
int baseid = MyCommFun.RequestInt("baseid");
string itemid = HttpContext.Current.Request["itemid"].ToString();
BLL.wx_vote_result resultBll = new BLL.wx_vote_result();
Model.wx_vote_result result = new Model.wx_vote_result();
BLL.wx_vote_item iBll = new BLL.wx_vote_item();
if (MyCommFun.QueryString("isradio") == "true")
{
result.baseid = baseid;
result.itemid = Convert.ToInt32(itemid);
result.openId = openid;
result.createDate = DateTime.Now;
resultBll.Add(result);
iBll.Update(result.itemid.Value, result.baseid.Value);
}
else
{
string[] sArray = itemid.Split(',');
for (int i = 0; i < sArray.Length; i++)
{
result.baseid = baseid;
result.itemid = Convert.ToInt32(sArray[i]);
result.openId = openid;
result.createDate = DateTime.Now;
resultBll.Add(result);
iBll.Update(result.itemid.Value, result.baseid.Value);
}
}
//AddAdminLog(MXEnums.ActionEnum.Add.ToString(), ""); //记录日志
jsonDict.Add("ret", "ok");
jsonDict.Add("content", "投票成功");
context.Response.Write(MyCommFun.getJsonStr(jsonDict));
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
因为前面设置的是投票完成后才可以看到投票结果,所以这里投完票后会显示投票的结果

- 计算投票数比例
protected float computeBL(int ttCount, int itemCount)
{
if (ttCount == 0)
{
return (float)0.00;
}
float ret = (itemCount * 100.0f) / ttCount;
ret = (float)Math.Round(ret, 2);
return ret;
}
用c#开发微信 (17) 微活动 3 投票活动 (文本投票)的更多相关文章
- 用c#开发微信 (7) 微渠道 - 推广渠道管理系统 2 业务逻辑实现
我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 上次介绍了 ...
- 用c#开发微信 (8) 微渠道 - 推广渠道管理系统 3 UI设计及后台处理
我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 前面二篇& ...
- 用c#开发微信 (11) 微统计 - 阅读分享统计系统 1 基础架构搭建
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...
- 用c#开发微信 (15) 微活动 1 大转盘
微信营销是一种新型的营销模式,由于微信更重视用户之间的互动,故而这种营销推广不不能盲目地套用微博营销的单纯大量广告推送方式.这种方式在微信营销中的效果非常差,会令用户反感,继而取消去企业或商家的微信公 ...
- 用c#开发微信 (16) 微活动 2 刮刮卡
微信营销是一种新型的营销模式,由于微信更重视用户之间的互动,故而这种营销推广不不能盲目地套用微博营销的单纯大量广告推送方式.这种方式在微信营销中的效果非常差,会令用户反感,继而取消去企业或商家的微信公 ...
- 用c#开发微信 (6) 微渠道 - 推广渠道管理系统 1 基础架构搭建
我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 本系统使用 ...
- 用c#开发微信 (9) 微渠道 - 推广渠道管理系统 4 部署测试 (最终效果图)
我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 本文是微渠 ...
- 用c#开发微信 (12) 微统计 - 阅读分享统计系统 2 业务逻辑实现
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...
- 用c#开发微信 (13) 微统计 - 阅读分享统计系统 3 UI设计及后台处理
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读. ...
随机推荐
- Hibernate day01笔记
框架体系结构 hibernate入门 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational:关系,二维表 ...
- (转)javascript中的对象查找
本文转自:http://otakustay.com/object-lookup-in-javascript/ ---很棒的一篇文章,作者的其他文章还暂时没读,但相信作者是一个谦虚 谨慎的好工程师 近 ...
- mysql 数据库备份
(2)使用命令行工具 备份数据库: mysqldump –user=root –password=root密码 –lock-all-tables 数据库名 > 备份文件.sql 恢复数据库: m ...
- ---Ubuntu 14.04 虚拟机器和主机时间同步
先把vmware tool 装好! sudo /usr/bin/vmware-toolbox-cmd timesync enable
- 主机名链接数据库,无法生成 SSPI 上下文
两台Server,环境一样,都使用同一域账号. 1的SQL Server可以通过Windows认证连接到2,但2通过Windows认证连接1时报如下错误: 目标主体名称不正确,无法生成 SSPI 上下 ...
- 一个最简单的登录页面测试case
具体需求: 有一个登陆页面, (假如上面有2个textbox, 一个提交按钮. 请针对这个页面设计30个以上的testcase.) 此题的考察目的:面试者是否熟悉各种测试方法,是否有丰富的Web测试经 ...
- asp.net下载文件方法
/// <summary> /// 下载 /// </summary> /// <param name="url"></param> ...
- php文章内容分页并生成相应的htm静态页面代码
代码如下: <?php $url='test.php?1=1'; $contents="fjka;fjsa;#page#批量生成分成文件并且加上分页代码"; $ptext = ...
- hdu 1797 靠谱的算法应该是最大生成树,但是本人用最大流做的
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 22294 Accepted: ...
- 【MVC】 js,css 压缩
[MVC] js,css 压缩 一. 引用 System.Web.Optimization.dll : 使用 Nuget ,在控制台输入 Install-Package Microsoft.AspNe ...