[已关闭问题] 博客园新闻Digg功能怎么实现?
提问时间: 2008-09-17 10:12
悬赏分:80 提问时间2008/9/17 10:12:50 问题为何被关闭 浏览:204 次

1.主要是不懂的,在不关闭页面的情况下,怎么识别用户只推荐一次,

2.麻烦能给个例子,高分请教.


问题补充:好像可以通过HttpSessionState..::.SessionID 属性获取会话的唯一标识符,然后进行判断,等试验好了,再给出代码。


(6)

例子没有,原理超简单,在你推荐的时候,对服务器的请求依然保持着你的身份验证信息,所以使用Session就可以 ,博客园好像是使用用户名配合IP地址做的验证


2个月前   回答者:丁学 - 专家六级

可以用ajax来实现,同时加上访问者ip来识别,或者再加上个时间的限制


2个月前   回答者:wingoo - 小虾三级

可以在Identity上作手脚,因为Principal可以是自定义的,因此加一个IsCommented字段就行,或者也可以在数据库里做啊,用SessionID和UserName的组合来判断,如果是页面关闭后也只能评论一次的话就用数据库里加字段的方法了


2个月前   回答者:Gray Zhang - 老鸟四级

对当前对话进行投票限制苟同丁的做法,大概因为我只知道用 session 标识当前对话。

Code
public void Vote(string pageid) {
if (Voted)
return;
//进行投票

Voted
= true;
}

public bool Voted {
get {
object o = Session["Voted"];
return o == null ? false : (bool)o;
}
set {
Session[
"Voted"] = value;
}
}


2个月前   回答者:陛下 - 老鸟四级

写入了用户名


2个月前   回答者:老尧 - 老鸟四级

我也需要


2个月前   回答者:孤星赏月 - 初学一级
2个月前   网管人生 :
幸运的事,asp.net提供了一些更简单的方法。上面的解决方案的缺点是我们要在控钮的事件中自己决定一些逻辑问题。设想一下,如果在你的解决方案中有成百个要提交的页面,你就得写上许多个这样的逻辑。自定义web控件和HTTP MOdules提供了相同的解决法。你可以将这个控件入在你需要控制的页面上,它就可以起作用了。当然,并不是所有的情况都需要的,比如说搜索页面是允许用户刷新的。但是,在页面中有插入、更新、删除数据库的操作时,控制刷新按钮是绝对有必要的。

下面来看一下上面的方案是如何工作的。
第一步:需要在System.web节中注册HTTP Module模块。

<httpModules>

<add name="SyncHttpModule" type="EAD.Controller.SyncHttpModule, sync"/>

</httpModules>

第二步:要在控制页的页面内放入我们开发好的控件。

工作原理:
它的工作原理和前面普通讲的是差不多的。只是这里提供了一个通用的方法。这里提供了一种通用的方式。在我看来,如果你有一些好的模式,将大大的加快你的开发速度。

我们需要在第一次提交时在Session中存储标记,并在请求时比较它们是否不同。通过HTTP handler,我们在Session中存储标记。有这样的一个事件PreRequestHandlerExecute 我们可以通过它找到Session,如果是其它事件的话Session是不存在的,比如BeginRequest 事件。在这个事件中比较两者的值,如果不同则证明是Refresh事件。这时你可以添加自己的处理方法,我一般是将转向一个页面告诉用户不能反复提交。
private void OnPreRequestHandlerExecute(object source, EventArgs e)

{

HttpContext context = ((HttpApplication) source).Context;

string _keyword = FrameworkConst.SYNC_CONTROL_KEYWORD;

string sesToken = (string) context.Session[_keyword];

string reqToken = context.Request.Params[_keyword];
//如果没有提交过,则保存Session和标记值

if(reqToken != FrameworkConst.BYPASS_SYNC_KEYWORD)
{
context.Session[_keyword] = context.Session.SessionID+DateTime.Now.Ticks.ToString();
}
if(reqToken != null && reqToken != sesToken)
{
string path=context.Request.ApplicationPath+
&"/Common/SyncControl.aspx?returnUrl="+
&context.Request.Url.AbsolutePath;
context.Server.Transfer(path);
}
}

SyncControl 控件将建立一个hidden input field 将在 HTTP module中设置的Session保存起来。
2个月前   网管人生 :
刚找到的解决方案,回去马上试试
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题



> 问题排行榜

相关内容

相关链接