mvp handlbars 判断不等于der放哪里

2013 MVPA Award Nominees
.Nominees have been announced for the 2013 MVPA Awards, the annual celebration of the best music video work as decided by a collection of production companies and directors, plus freelance workers and other music video related companies&production community.Director Floria Sigismond pops up the most here, with nominated videos in&12 categories. Directing duo&DANIELS scores eight, while&Anthony Mandler, Benny Boom and Colin Tilley each have seven nominations.Highlighted directors for Director of the year honors are as follows directly below, with .The MVPA Awards will be held May 30 in Los Angeles. Ticket information to be announced soon.. Congrats to all the nominees!DIRECTOR OF THE YEARRyan Hope for
(Colonel Blimp UK, prod co.)Director X& for
(DNA& Inc., prod. co)Melina Matsoukas&for
(PRETTYBIRD, prod. co)Floria Sigismondi for
(Black Dog Films, prod co.)DANIELS&for
(PRETTYBIRD, prod co.)BEST DIRECTORIAL DEBUT&&&&&&&&&Ellis Bahl&for
(Project Fathom, prod co.)Brian Charles Lehrer&for
(WinterWolf Media, prod co.)Jason Baum&for
(Jason Baum Films, prod co.)BREWER&for
(PRETTYBIRD, prod co.)Ian & Cooper&for
(PRETTYBIRD, prod co.)BEST DIRECTION OF A BAND &&Warren Fu&for
(Partizan Entertainment, prod co.)Melina Matsoukas&for
(PRETTYBIRD, prod co.)Jordan Bahat&for
(Artists and Derelicts, prod co.)BREWER&for
(PRETTYBIRD, prod co.)DANIELS for
(PRETTYBIRD, prod co.)BEST DIRECTION OF A FEMALE ARTIST& & & & &&Benny Boom&for
(London Alley Entertainment, prod co.)Tony T. Datis&for
(DNA& Inc., prod co.)Anthony Mandler&for
(Black Hand Cinema, prod co.)Anthony Mandler&for
(Black Hand Cinema, prod co.)Melina Matsoukas for
(PRETTYBIRD, prod co.)BEST DIRECTION OF A MALE ARTIST& &&Christopher Sims&for &(DNA& Inc., prod co.)Chris Robinson & A$AP Rocky for &(Robot Films, prod co.)Floria Sigismondi& for
(Black Dog Films, prod co.)Floria Sigismondi&for
(Black Dog Films, prod co.)David Fincher for
(RESET, prod co.)BEST DIRECTION OF A NEW ARTIST &&Joe Toman&for
(HSI Productions, prod co.)Daniel Kragh-Jacobsen&for
(Black Dog Films, prod co.)Chris Robinson & A$AP Rocky for
(Robot Films, prod co.)Melina Matsoukas&for
(PRETTYBIRD, prod co.)Melina Matsoukas&for
(PRETTYBIRD, prod co.)BEST VIDEO PRODUCED FOR UNDER $25,000& & & & &&
(Floria Sigismond, dir. | Coleen Haynes , producer | Black Dog Films, prod co.)
(Ian Cooper, dir. | Nathan Scherrer, producer | PRETTYBIRD, prod co.)
(Christian Larson, dir. | Noreen Khan, producer | Black Dog Films&&&&&&&&&&& , prod. Co)
(Carlos Lopez Estrada, dir. | Sarah Lawson, prod. | Doomsday Entertainment, prod co.)
(Hiro Murai, dir. | Jason Colon, producer | Doomsday Entertainment, prod co.)BEST ADULT CONTEMPORARY VIDEO&
(Justin Baldoni, dir. | Oil Factory Inc., prod co)
(Philip Andelman, dir. | Sara Otterstrom, producer | Partizan Entertainment, prod co.)
(Philip Andelman, dir. | Melissa Larsen, producer | Partizan Entertainment, prod co.)
(Rich Lee, dir. | DNA& Inc., prod co)
(Joe Toman, dir. | Megan Gutman, producer | HSI Productions, prod co.)BEST ALTERNATIVE VIDEO & & &
(Ellis Bahl, dir. | Jessica& Bermingham, producer | Project Fathom, prod co.)
(Hiro Murai, dir. | Jonathan Wang, producer | &Doomsday Entertainment, prod co.)
(David Altobelli, dir. | Sarah Park, producer | The Directors Bureau, prod co.)
(Jordan Bahat, dir. | Artists and Derelicts, prod co)
(Syndrome, dir. | Plus Four Productions, prod co)
(Carlos Lopez Estrada, dir. | Sarah Lawson, producer | Doomsday Entertainment, prod co.)BEST ELECTRONIC VIDEO & & &&
(Dawn Shadforth, dir. | Alicia Richards, producer | Little Minx / Black Dog Films via Sonny UK, prod co.)
(Wendy Morgan, dir. | Morna Ciraki, producer | Believe Media, prod co.)
(Ian & Cooper, dir. | PRETTYBIRD, prod co)
(Hiro Murai, dir. | Jonathan Wang, producer | Doomsday Entertainment, prod co.)
(Tony T. Datis, dir. | DNA& Inc., prod co)BEST HIP HOP VIDEO & & & & &&
(CHRIS ROBINSON / A$AP ROCKY, dir. | Sway Mendez, producer | Robot Films, prod co.)
(Hannah Lux Davis, dir. | Brandon Bonfiglio, producer | London Alley Entertainment, prod co.)
(Benny Boom, dir. | Brandon Bonfiglio, producer | London Alley Entertainment, prod co.)
(Colin Tilley, dir. | Brandon Bonfiglio, producer | London Alley Entertainment, prod co.)
(Rich Lee, dir. | DNA& Inc. , prod co)
(Hiro Murai, dir. | Jason Colon, producer | Doomsday Entertainment, prod co.)BEST POP VIDEO
(Benny Boom, dir. | Brandon Bonfiglio, producer | London Alley Entertainment, prod co.)
(Floria Sigismondi, dir. | Dawn Rose, producer | Black Dog Films, prod co.)
(Tony T. Datis, dir. | DNA& Inc. , prod co)
(Melina Matsoukas, dir. | PRETTYBIRD , prod co)
(DANIELS, dir. | Gaetano Crupi Jr. , producer | PRETTYBIRD, prod co.)
(David Fincher, dir. | Timory King, producer | RESET, prod co.)&BEST R&B VIDEO& & &
(Benny Boom, dir. | Brandon Bonfiglio, producer | London Alley Entertainment, prod co.)
(Benny Boom, dir. | Brandon Bonfiglio & Luga Podesta, producer | London Alley Entertainment, prod co.)
(Sylvain White, dir. | Andrew Listermann, producer | Riveting Entertainment, prod co.)
(Christopher Sims, dir. | DNA& Inc. , prod co)
(Diane Martel, dir. | David Robertson, producer | Black Dog Films, prod co.)BEST ROCK VIDEO & &
(Jordan Bahat, dir. | Artists and Derelicts, prod co)
(Nash Edgerton, dir. | Jonathan Wang, producer | The Directors Bureau, prod co.)
(Daniel Cloud Campos, dir. | Anne Johnson, producer | Doomsday Entertainment, prod co.)
(Syndrome, dir. | Plus Four Productions, prod co)
(Dori Oskowitz, dir. | PRETTYBIRD, prod co)BEST INTERNATIONAL VIDEO &
(Storm/Hansen, dir. | Kasper Graversen, producer | The Kompany Entertainment, prod co.)
(Frank Borin, dir. | Angela Gregory, producer | Velvet Films, prod co.)
(Wendy Morgan, dir. | Morna Ciraki, producer | Believe Media, prod co.)
(Idris Elba and Dan Cadan, dir. | Leopoldo Gout& & Ben Schneider, producer | @radical.media& Green Door Pictures, prod co.)&&&&
(Ian & Cooper, dir. | Nathan Scherrer, producer | PRETTYBIRD, prod co.)BEST ANIMATED VIDEO& & & & &
(Greg Jardin, dir. | Jessica Roulston, producer | @radical.media, prod co.)
(Warren Fu, dir. | Josh Goldstein, producer | Partizan Entertainment, prod co.)BEST ART DIRECTION
(Alexander Delgado, art director | Riveting Entertainment, prod co.)
(Alexander Delgado, art director | London Alley Entertainment, prod co.)
(Alexander Delgado, art director | London Alley Entertainment, prod co.)
(David Courtemarche, art director | Happy Place, prod co.)
(Sue Tebbutt, art director | Black Dog Films, prod co.)&BEST CHOREOGRAPHY
(Aakomon Jones, choreographer |&Believe Media, prod co.)
(King Charles, choreographer |&Believe Media, prod co.)
(Marty Kudelka, choreographer | RESET, prod co.)
(Riveting Entertainment, prod co.)&BEST CINEMATOGRAPHY & & & &&
(Starr Whitesides, DP | Black Dog Film/RSA, prod co.)
(Rob Witt, DP | DNA, Inc. , prod co.)
(Arnaud Potier, DP | Iconoclast, prod co.)Jus
(Matthew Libatique, DP | RESET, prod co.)
(Larkin Seiple, DP | PRETTYBIRD, prod co.)BEST COLORIST
(Tom Poole @Company 3, colorist | Black Hand Cinema, prod co.)
(Dave Hussey @Company 3 , colorist | HHID LLC. , prod co.)
(Stefan Sonnenfeld @Company 3, colorist | Black Dog Films, prod co.)
(Sean Coleman @ Company 3, colorist | Black Dog Films, prod co.)
(Sean Coleman @Company 3, colorist | What Matters Most, prod co.)&BEST COMPUTER EFFECT (FX DONE IN COMPUTER) &&
(Zak Stoltz, Ben Brewer, Brandon Hirzel, fx | PRETTYBIRD, prod co.)
(Ben Brewer, fx | PRETTYBIRD, prod co.)Passion Pit &Cry Like A Ghost&
(Jeff Desom, fx | PRETTYBIRD, prod co.)
(BEMO, fx | Doomsday Entertainment, prod co.)
(PRETTYBIRD, prod co.).BEST EDITING&&
(Jacquelyn London @ Sunset Edit, editor | Tricycle Logic& LLC, prod co.)
(Jacquelyn London @ Sunset Edit, editor | Black Hand Cinema, prod co.)
(Jarrett Fijal @ Bonch& Inc. , editor | Black Dog, prod co.)
(Jeff Selis @ Bonch& Inc. , editor | Black Hand Cinema, prod co.)
(Jacquelyn London @ Sunset Edit, editor | Artists And Derelicts, prod co.)
(Jacquelyn London @ Sunset Edit, editor | Black Hand Cinema, prod co.)BEST SPECIAL EFFECTS (FX DONE ON-SCENE OR IN-CAMERA)
(Greg Jardin, dir. | @radical.media, prod co.)
(Colin Tilley, dir. | London Alley Entertainment, prod co.)
(Ian & Cooper, dir. | PRETTYBIRD, prod co.)
(BREWER, dir. | PRETTYBIRD, prod co.)
(DANIELS, dir. | PRETTYBIRD, prod co.)BEST STYLING
(Marissa Flores & Gianni Arteaga, stylist | London Alley Entertainment, prod co.)
(Soyon An & Gianni Catalina Arteaga, stylist | London Alley Entertainment, prod co.)
(Soyon An & Sarah Hawkins, stylist | London Alley Entertainment, prod co.)
(Nicki Minaj, stylist | London Alley Entertainment, prod co.)
(Trish Summerville, stylist | RESET, prod co.)BEST HAIR
(Pamela Neal, hair stylist | Black Dog Films, prod co.)
(Tippi Shorter, hair stylist | London Alley Entertainment, prod co.)
(Pamela Neal, hair stylist | Black Dog Films, prod co.)
(Danilo Dixon, hair stylist | DNA& Inc. , prod co.)BEST MAKE-UP
(Natalie MacGowan Spencer, make-up artist | RESET, prod co.)
(Sheika Daley, make-up artist | London Alley Entertainment, prod co.)
(Taylor Tompkins, make-up artist | London Alley Entertainment, prod co.)
(Lut! Media, prod co.)
You Might Also LikeAndroid(9)
Main主页逻辑代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_create,btn_add,btn_delete,btn_update,btn_query,btn_
private HandlerD
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定控件和添加点击事件
findView();
private void findView() {
btn_create= (Button) findViewById(R.id.button);
btn_add= (Button) findViewById(R.id.button2);
btn_update= (Button) findViewById(R.id.button3);
btn_query= (Button) findViewById(R.id.button4);
btn_delete= (Button) findViewById(R.id.button5);
btn_renew= (Button) findViewById(R.id.button6);
btn_create.setOnClickListener(this);
btn_add.setOnClickListener(this);
btn_update.setOnClickListener(this);
btn_query.setOnClickListener(this);
btn_delete.setOnClickListener(this);
btn_renew.setOnClickListener(this);
//调用MVP中的P也就是逻辑层代码
hd=new HandlerDaoImpl();
public void onClick(View v) {
String sql=&&;
Object [] obj=
switch (v.getId()){
case R.id.button:
//查看user数据库表是否存在判断是否创建成功!
sql=&SELECT COUNT(*) FROM sqlite_master where type='table' and name='user'&;
case R.id.button2:
//插入一条测试数据
sql=&insert into user(name,age) values(?,?)&;
//插入的值
obj=new Object[]{&张三&,20};
case R.id.button3:
//根据id修改插入的数据
sql=&update user set name=? where _id=?&;
obj=new Object[]{&李四&,1};
case R.id.button4:
//查询数据库数据
sql=&select * from user&;
case R.id.button5:
//根据名称删除某条数据
sql=&delete from user where name=?&;
obj=new Object[]{&李四&};
case R.id.button6:
//更新数据库版本
//调用实现类完成具体的逻辑操作
hd.handler(v.getId(),this,sql,obj);
HandDao层代码主要是一个接口
public interface HandlerDao
public void handler(int num, Context context, String sql, Object[] obj);}
主要的代码逻辑通过Main主页传递过来的sql语句执行相应操作
public class HandlerDaoImpl implements HandlerDao {
//数据库表
private UserDB userDB;
public void handler(int num, Context context, String sql,Object[] obj) {
this.context =
if (userDB == null) {
userDB = new UserDB(context, &user.db&, null, 1);
switch (num) {
case R.id.button:
if (isCreate(sql)) {
showMake(&创建成功!&);
showMake(&创建失败!&);
case R.id.button2:
if (isNotQuery(sql,obj)) {
showMake(&新增成功!&);
showMake(&新增失败!&);
case R.id.button3:
if (isNotQuery(sql,obj)) {
showMake(&修改成功!&);
showMake(&修改失败!&);
case R.id.button4:
int count = findAll(sql);
if (count & 0) {
showMake(&总共查询出& + count + &条数据!&);
} else if (count == 0) {
showMake(&为查找到数据!&);
showMake(&有一个未知错误!&);
case R.id.button5:
if (isNotQuery(sql,obj)) {
showMake(&删除成功!&);
showMake(&删除失败!&);
case R.id.button6:
UserDB ud = new UserDB(context, &user.db&, null, 2);
SQLiteDatabase sd = userDB.getWritableDatabase();
showMake(&更新成功!&);
} catch (Exception e) {
Log.d(&###&, e.getMessage());
showMake(&更新失败!&);
e.printStackTrace();
private void showMake(String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
//创建数据库
private boolean isCreate(String sql) {
boolean isCreate =
SQLiteDatabase sqLiteDatabase = userDB.getWritableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(sql, null);
while (cursor.moveToNext()) {
int count = cursor.getInt(0);
if (count & 0) {
isCreate =
//关闭访问
sqLiteDatabase.close();
}catch (Exception e){
Log.d(&###&,e.getMessage());
e.printStackTrace();
return isC
//新增,修改,删除数据库
private boolean isNotQuery(String sql,Object[] obj) {
SQLiteDatabase sqLiteDatabase =
sqLiteDatabase = userDB.getWritableDatabase();
sqLiteDatabase.execSQL(sql,obj);
} catch (Exception e) {
Log.d(&###&, e.getMessage());
} finally {
//关闭数据库链接
sqLiteDatabase.close();
private int findAll(String sql) {
List&UserInfo& list = new ArrayList&UserInfo&();
SQLiteDatabase sqLiteDatabase=
sqLiteDatabase = userDB.getWritableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(sql, null);
while (cursor.moveToNext()) {
UserInfo user = new UserInfo();
//根据数据库表中字段的顺序获取值
user.setId(cursor.getInt(0));
//根据数据库表中字段的名称获取值
user.setName(cursor.getColumnName(cursor.getColumnIndex(&name&)));
user.setAge(cursor.getInt(2));
list.add(user);
} catch (Exception e) {
list.clear();
Log.d(&###&, e.getMessage());
sqLiteDatabase.close();
return list.size();
数据库的相应代码
public class UserDB extends SQLiteOpenHelper{
public UserDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
public UserDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
super(context, name, factory, version, errorHandler);
public void onCreate(SQLiteDatabase db) {
//创建数据库表sql语句
String sql=&create table user(_id integer parmary key,name varchar(10) not null,age integer not null)&;
//执行创建数据库表sql
db.execSQL(sql);
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion==2){
//开启一个事务 如果数据库表更新操作失败可以通过事务回滚
db.beginTransaction();
//1:修改之前的数据库表的表名
db.execSQL(&alter table user rename to user_test&);
//2:创建一张新的数据库表
db.execSQL(&create table user(_id integer primary key,,name varchar(20) not null,,age integer not null,see varchar(10) not null)&);
//3:拷贝之前的数据库表数据到新表里面并给新添加的字段赋值
db.execSQL(&insert into user select _id,name,age,'' from user_test&);
//4:删除原版本数据库表
db.execSQL(&drop table user_test&);
//5:设置事务处理成功,如果不设置会自动回滚不会提交
db.setTransactionSuccessful();
//6:从beginTransaction开始的操作都会提交
db.endTransaction();
}catch (Exception e){
//数据库表更新操作出错因设置了事务会自动回滚
e.printStackTrace();
简单的实体Beanpublic class UserInfo implements Serializable{
public int getAge() {
public void setAge(int age) {
this.age =
public int getId() {
public void setId(int id) {
public String getName() {
public void setName(String name) {
this.name =
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2498次
排名:千里之外
原创:12篇
(2)(2)(3)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'&>&自定义异常处理器UncaughtExceptionHandlder
自定义异常处理器UncaughtExceptionHandlder
上传大小:4.1MB
实际开发中必不可少的标准代码,0分只为资源共享。希望能对您有所帮助。
综合评分:0(0位用户评分)
所需积分/C币:
下载个数:30
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有0条
审核通过送C币
gradle离线下载集合
创建者:zyq
微信商城专辑
创建者:velada
Android初学者
创建者:haicheng20
上传者其他资源上传者专辑
Android 弹幕效果
idengen,jar
Android中的MVC、MVP和MVVM
录制gif工具
Android RxJava/RxAndroid结合Retrofit
移动开发热门标签
VIP会员动态
下载频道积分规则调整V1710.18
CSDN下载频道积分调整公告V1710.17
开通VIP,海量IT资源任性下载
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
为了良好体验,不建议使用迅雷下载
自定义异常处理器UncaughtExceptionHandlder
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:786
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站1200个资源免积分下载
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
全站1200个资源免积分下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站1200个资源免积分下载
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
自定义异常处理器UncaughtExceptionHandlder三者之间的关系
在MVP初探里简单的描述了V和P之间是如何交互的。
无论是PV还是SC,M\V\P这三者之间的关系并没有发生改变,V只是前端的客户代理承现展显数据,P是如何处理客户交互行为的决策者。
数据是P主动&推&给V的,而V只向P发送用户通知,都是单向的;所以在IView中被Presenter调用的方法应该都是没有返回值的。可以通过调用IView中的方法,也可以通过事件注册的方式来实现P/V之间的交互。
那么,在PV模式下View是被动的,而P则控制着对V请求的处理;view仅将用户的(事件)请求提交到P,它并不参与对用户请求的处理,如果在这个过程中P要V参与(如:显示实时的数据等)也是P将要展现的数据PUSH到V,对于处理的结果的呈现也是同样的处理方式。
而P在此过程中的角色是一个决策者,它决定如何处理V提交过来的用户请求,如何去实现业务逻辑和调用Model。
如何维护三者的关系
View仅是传递用户请求和对数据的呈现;Presenter是事件的的决策者;Model业务逻辑执行者。
在PV中三者的关系使用的uView可以直接调用Presenter,这样就会使用的在开发过程中将Presenter作为View和Model之间的一种代理(Proxy)而不是Presenter.
那么我们就可以通过事件订阅机制来解决这个问题。
编程模型的实现
首先,要让View不能访问到Presenter,我们可以通过事件订阅机制;为所有的Presenter创建基类Presenter&IView&,泛型类型IView表示具体View实现的接口。表示View的同名只读属性在构造函数中赋值,赋值完成之后调用调用虚方法OnViewSet,使得对具体的Presenter可以重写该方法进行对View进行事件注册工作。
1 namespace Handwe.Demo.MVP
public class Presenter&IView&
public IView View { get; set; }
public Presenter(IView view){
this.View =
this.OnViewSet();
protected virtual void OnViewSet()
&其次,Presenter是通过接口的方式与View进行交互的。有时候我们要通过这个接口访问Form的一些属性、方法和事件,需要将相应的成员定义在接口上面,可能会有很多,添加的删减等。那么,我们可以将这些成员定义在一个接口中,具体View的接口继承该接口就可以了。在这里,我们相当是为所有的View接口创建了&基接口&。如下:
1 namespace Handwe.Demo.MVP
public interface IViewBase
event EventHandler L
event EventHandler C
event CancelEventHandler C
string ResultText
同时,也要创建所有的View创建基类ViewBase,做必要的初始化工作,如加载基础数据等:
1 namespace Handwe.Demo.MVP
public class ViewBase : Form
public ViewBase()
this.CreatePresenter();
protected virtual object CreatePresenter()
if (LicenseManager.CurrentContext.UsageMode == LicenseUsageMode.Designtime)
return null;
throw new NotImplementedException(string.Format("{0} must override the CreatedPresenter method.", this.GetType().FullName));
&在ViewBase中调用CreatedPresenter(),它的实现在具体的每个View中也就是实现Presenter和View对应;
1 public partial class CalculatorView : ViewBase, ICalculatorView
3 protected override object CreatePresenter()
return new CalculatePresenter(this);
实例的实现:
那边现在可以定义View的接口ICalculatorView,在这里定义了一个事件Calculating,也就是点击btnCalculate触发,还要定义三个方法,DisplayResult(int result)、DisplayMsg(stirng msg)、还有一个是Clear();具体什么用途看名称就知道了,如下:
1 namespace Handwe.Demo.UnityInMVP
public interface ICalculatorView : IViewBase
event EventHandler&CalculateEventArgs& C
void DisplayResult(int result);
void DisplayMsg(string msg);
void Clear();
这里有一个CalculateEventArgs,它是自定义的事件参数类型:
1 namespace Handwe.Demo.UnityInMVP
public class CalculateEventArgs : EventArgs
public string OperationNum1 { get; set; }
public string OperationNum2 { get; set; }
很简单只定义了两个属性;
&接着来实现CalculatorView,代码如下:
1 namespace Handwe.Demo.UnityInMVP
public partial class CalculatorView : ViewBase, ICalculatorView
public CalculatorView()
InitializeComponent();
public string ResultText
get { return this.labResult.T } set{this.labResult.Text =}
protected override object CreatePresenter()
return new CalculatorPresenter();18
#region ICalculateView Members
public event EventHandler&CalculateEventArgs& C
public void DisplayResult(int result)
this.textBoxResult.Text = result.ToString();
public void Clear()
this.textBoxOp1.Text = string.E
this.textBoxOp2.Text = string.E
this.DisplayMsg(string.Empty);
public void DisplayMsg(string msg)
this.labDisplayMsg.Text =
#endregion
private void btnCalculate_Click(object sender, EventArgs e)
string op1 = this.textBoxOp1.Text.Trim();
string op2 = this.textBoxOp2.Text.Trim();
this.OnCalculating(op1, op2);
private void btnClear_Click(object sender, EventArgs e)
private void btnCheck_Click(object sender, EventArgs e)
protected virtual void OnCalculating(string op1, string op2)
if (null != this.Calculating)
this.Calculating(this, new CalculateEventArgs { OperationNum1 = op1, OperationNum2 = op2 });
然后我们实现事件的订阅者,这里就是CalculatePresenter:
1 namespace Handwe.Demo.UnityInMVP
public class CalculatePresenter : Presenter&ICalculatorView&
public CalculatePresenter(ICalculatorView view):base(view)
this.Calculate = new Calculate();
public Calculate Calculate
protected override void OnViewSet()
this.View.Load += (sender, args) =&
this.View.Clear();
this.View.Calculating += (sender, args) =&
int op1, op2;
if (!int.TryParse(args.OperationNum1, out op1))
this.View.DisplayMsg(string.Format("{0} type invalid.", args.OperationNum1));
if (!int.TryParse(args.OperationNum2, out op2))
this.View.DisplayMsg(string.Format("{0} type invalid.", args.OperationNum1));
int result = this.Calculator.Divide(op1, op2);
this.View.DisplayResult(result);
this.View.Clear();
this.View.DisplayMsg("please type operation numbers.");
至此,Calculator演示实例已基本完成了,下篇将会在这个实例的基础上引入Unity、PIAB、Exception Handling,实现对Calculate的解耦和异常处理。《》
/coble/p/5646717.html
阅读(...) 评论()

我要回帖

更多关于 csgomvp怎么放歌 的文章

 

随机推荐