一个简单的MVC绑定示例,欢迎提出意见

以专业开发人员为伍 2008-08-29 04:23:55
public class AspDotNetBinding
{
public enum Direction
{
Oneway,
Twoway
}

private bool pageLoaded = false;
private bool targetChanged = false;

//当Source的某个属性变动时,自动将值传递给Target的某个属性,或者相反。通常,Soruce是一个asp.net的控件,而Target是一个内存中的数据模型对象。

public AspDotNetBinding(Control source, string sourcePropName, Object target, string targetPropName,
Func<object, object> parse, Func<object, object> format, Direction dir)
{
source.Page.Load += new EventHandler((s, e) => this.pageLoaded = true);
var sp = TypeDescriptor.GetProperties(source).Find(sourcePropName, false);
var tp = TypeDescriptor.GetProperties(target).Find(targetPropName, false); //有时需要在页面内刷新后台数据并回调前台。
if (!sp.IsReadOnly)
source.Page.PreRender += new EventHandler((s, e) =>
{
if (!source.Page.IsPostBack || targetChanged)
{
var sv = sp.GetValue(source);
var tv = tp.GetValue(target);
if (format != null)
tv = format(tv);
if (!sv.Equals(tv))
sp.SetValue(source, tv);
}
});
if (dir != Direction.Oneway && !tp.IsReadOnly)
sp.AddValueChanged(source, (s, e) =>
{
if (this.pageLoaded) //确保只有被asp.net机制的 IPostDataChangedEvent 触发的修改才更新后台数据。
{
var sv = sp.GetValue(source);
var tv = tp.GetValue(target);
if (parse != null)
sv = parse(sv);
if (!sv.Equals(tv))
tp.SetValue(target, sv);
}
});
tp.AddValueChanged(target, (s, e) =>
{
targetChanged = true;
});
}

//当asp.net的控件Source的某个事件触发,将自动改变另外一个对象Target的某个属性。

public AspDotNetBinding(Control source, string eventName, Func<object> getValue, Object target, string targetPropName)
{
var tp = TypeDescriptor.GetProperties(target).Find(targetPropName, false);
if (!tp.IsReadOnly)
TypeDescriptor.GetEvents(source).Find(eventName, false)
.AddEventHandler(source, new EventHandler((s, e) =>
{
var tv = tp.GetValue(target);
var value = getValue();
if (!value.Equals(tv))
tp.SetValue(target, value);
}));
}

}


其实我已经不再使用asp.net写程序了,写这个只是简单总结一点多年前的一些asp.net开发思路。这里使用了一点.net 3.0的比较新的语法。

这个程序意思很明显,就是实例如何让asp.net编写程序摆脱“事件编程”的束缚(其实asp.net事件编程思想许多人还没有熟练),转而使用MVC思想。你可以仅仅在page_load中用“一行代码”声明控件之间的逻辑控制逻辑,许多控制就由这段代码代劳了,而无需像传统的事件编程那样在事件中重复地手写很多类似功能(只是所操作的对象不同)的代码。

asp.net是服务器编程,与其它客户端编程不同,当一个控制变量改变时需要引发子控件改变(特别是动态创建大规模的子控件是),你不能立刻去创建它,而应该仅仅坐下标记。只有到PreRender阶段才应该真正创建子控件。

这段代码也是为了回复另外一个帖子的。这段代码需要对asp.net和反射着两个技术都比较了解。
...全文
504 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywtywt337 2009-03-26
  • 打赏
  • 举报
回复
mark
datahandler2 2008-09-08
  • 打赏
  • 举报
回复
看不懂,汗汗
sxmonsy 2008-08-30
  • 打赏
  • 举报
回复
学习.
shadowjl 2008-08-30
  • 打赏
  • 举报
回复
mark
美丽海洋 2008-08-30
  • 打赏
  • 举报
回复
楼主还是给出个demo让下载吧。
tkscascor 2008-08-30
  • 打赏
  • 举报
回复
up
anhao2008 2008-08-30
  • 打赏
  • 举报
回复
高手呀
amandag 2008-08-30
  • 打赏
  • 举报
回复
收藏
白云任去留 2008-08-30
  • 打赏
  • 举报
回复
up
palm_java 2008-08-30
  • 打赏
  • 举报
回复
mark
jackeyabc 2008-08-30
  • 打赏
  • 举报
回复
收藏
qinqinhao 2008-08-30
  • 打赏
  • 举报
回复
ding
紫气东来_999 2008-08-30
  • 打赏
  • 举报
回复
好贴~
Heaven_feather 2008-08-30
  • 打赏
  • 举报
回复
.....高手..看不懂饿-.-
冷月孤峰 2008-08-30
  • 打赏
  • 举报
回复
语法看不懂
zzuyongp 2008-08-30
  • 打赏
  • 举报
回复
技术就是拿来玩的所
xgg337027773 2008-08-30
  • 打赏
  • 举报
回复
看不懂,惭愧!
zhangli0911 2008-08-30
  • 打赏
  • 举报
回复
学习、
zhangli0911 2008-08-30
  • 打赏
  • 举报
回复
学习、
itcoo 2008-08-30
  • 打赏
  • 举报
回复
mark!
加载更多回复(28)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧