浅谈 facebook .net sdk 应用

 

今天看了一篇非常好的文章,就放在这里与大家分享一下,顺便也给自己留一份。这段时间一直在学习MVC,另外如果大家有什么好的建议或者学习的地方,也请告知一下,谢谢。

  这篇主要介绍如何应用facebook .net SDK,实现发帖、点赞、上传照片视频等功能,更多关于facebook API,请参考:https://developers.facebook.com

  1、注册facebook账号,并且注册facebook app,参考地址:https://developers.facebook.com/apps,注册了app之后,会得到一些此app的信息,

  这些信息都是要用到的。

2、注册好了App之后,开始新建解决方案(本例为asp.net mvc4 web app)

3、引入facebook .net sdk,下载地址:https://github.com/facebook-csharp-sdk/facebook-csharp-sdk,关于更多SDK文档地址:https://developers.facebook.com/docs/

除了直接下载之外,还能通过NuGet添加

4、安装完Facebook SDK,对web.config文件做点设置如下

5、一切准备就绪,现在开始使用SDK,首先登入授权,授权过程中有个scope参数,这里面是表示要授权的一些项

 

6、登入成功之后会跳转到上文提到的redirect_uri地址,而且会传回一个code值,我们用传回来的code去换取access token(这个灰常重要)

7、拿到access token之后,就可以用它做很多事情了,例如发状态上传照片

a.发状态

b.发链接

c.传照片

d.传视频

e.点赞

f.发送App邀请

g.获取状态列表

h.获取个人用户信息和朋友信息

希望这些也能让需要的人看到,对大家有所帮助。

 
 
分类: C#
标签: facebook.netsdk

ASP.NET MVC 初体验

 

MVC系列文章终于开始了,前段时间公司项目结束后一直在封装一个html+ashx+js+easyui的权限系统,最近差不多也完成了,迟些时候会分享源码给大家。当然这个MVC系列结束后如果时间允许还会另写一个MVC + EF + extjs的权限系统作为总结,希望有兴趣的朋友保持关注。

本系列文章使用的环境是:vs2010 + 4.0 framework、sql 2008企业版、MVC3、EF4.1
注:VS2010不带MVC3,ASP.NET MVC 3 RTM下载地址点我。装的时候vs不要打开,先装MVC3,再装汉化包。安装中不要强制取消,就算取消也要等回滚完,否则下次vs启动不了。

一、ASP.NET MVC 3 小试牛刀

新建项目 - 创建mvc3 web应用程序 - 模板选空、视图引擎Razor、不使用HTML5,建好项目后,解决方案是这样的:

和传统的webForm不太一样,这里不写任何代码直接Ctrl+F5跑下程序,会得到:

404找不到页面。webForm里直接运行项目会列出已有的文件让你点选然后运行,当然也可以在页面上右键 - 在浏览器中查看。mvc稍有不同是通过路由找控制器controller里的action,action再调用指定的视图view呈现页面。快速理解:
M Model:实体模型/视图模型;
V View:视图。就是html页面,这个html页面接收强类型的数据,可以展示数据;
C Controller:控制器。控制器下面有不同的action,类似webForm里常用的一般处理程序ashx,处理数据然后抛到前台给view显示的。

解决上面404错误问题先得看看Global.asax里默认路由的定义:

routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);

程序会默认使用这个名为Default的路由,找的是名称是Home的Controller,调用HomeController里的名为Index的Action,呈现的是Index这个Action里指定的视图View。到这里就很明显知道为何是404了,因为既没有HomeController,也没有Index这个Action,同时也没有任何视图View。在解决方案里的Controller目录上右键 - 创建控制器,为了和默认路由搭上,控制器的名字就是HomeController,是一个空控制器。打开HomeController.cs:

public ActionResult Index()
{
return View();
}

HomeController里默认就有一个叫Index的Action,并且这个Action的返回值不是void,也不是bool,也不是string,而是ActionResult。这个ActionResult就是视图的意思,返回一个视图给Action(直接return View();的话就是返回默认视图,即和Action同名的Index),然后响应给控制器,最终显示给用户。
注:常用的还有JsonResultRedirectResult等等。具体点这里

先不返回视图给Action,返回一个string试试:

public string Index()
{
return "hElLo WOrLd!!!";
}

很明显,返回的不是ActionResult了,而是string了,Ctrl+F5再运行下程序,显示:

很容易理解:默认路由找HomeController下的名为Index的Action拿到数据显示到浏览器,这里拿到的数据就是Index这个Action返回的字符串。右键查看下页面的源码,很纯粹的源码,就一个“hElLo WOrLd!!!”字符串。
注意下上图的url:localhost:1030,其实完整的是localhost:1030/home,默认路由里已经指定了,所以可以省略。

再修改方法:

public ActionResult Index()
{
return View();
}

然后在这个方法里右键 - 添加视图 - 默认就是和Action同名的Index视图,不使用模板。添加后项目的Views目录下就多一个Home子目录,目录里有一个Index.cshtml,修改其中的代码为:

@{
Layout = null;
}
hElLo WOrLd!!!

Layout=null就是不使用模板。按F6编译下项目,然后再跑下程序发现和之前显示一样,查看源码也一样,这里很好理解:Controller找Action,Action调用对应的View呈现页面
完整的url是:localhost:1030/home/index 意思就是找的是Home这个控制器下的Index这个Action,最终呈现的页面是这个Action指定的视图,也就是Index这个视图呈现的。

二、向视图中输出动态内容

asp、aspx等动态页面相比于静态的html好处就是可以根据传递的参数动态的显示内容,视图.cshtml自然也可以,可以通过ViewBag来实现,修改action:

public ActionResult Index()
{
int hour = DateTime.Now.Hour;
ViewBag.Greeting = hour < 12 ? "早上好" : "下午好";
return View();
}

通过一个三元表达式给ViewBag.Greeting赋了一个值,然后在前台View加个@符号就可以调用了:@ViewBag.Greeting WOrLd!!! 
F6编译下项目再跑下程序,如愿的显示了:
下午好 WOrLd!!!
注:前台和后台的ViewBag打点都是无智能提示的,只要前后台的名称一样即可调用

三、稍复杂的例子

ok,到这基本就已经知道mvc是怎么玩的了,现在来一个稍复杂的例子,模拟邀请客人参加party的小程序:
先到解决方案的Models目录下添加一个客人信息类:

/// <summary>
/// 客人信息类
/// </summary>
public class GuestResponse
{
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public bool? WillAttend { get; set; } //是否参加(可空类型)
}

修改之前的Index视图:

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div>
@ViewBag.Greeting, WOrLd!!!
<p>
我们将举办一个Party<br />
</p>
@Html.ActionLink("填表参加", "RsvpForm")
</div>
</body>
</html>

跟普通html页面不同的是Rozar语法里所有的页面元素都是通过html辅助方法生成的,这里的@Html.ActionLink("填表参加", "RsvpForm")就是生成一个a标签。Rozar语法简单清爽,写个@符号就可以开始在页面上写代码了。

根据智能提示可知,第一个参数"RSVP Now"是a标签的文字,第二个参数"RsvpForm"是请求的Action,那么自然需要添加这个Action,否则点击又找不到视图了:

public ViewResult RsvpForm()
{
return View();
}

一看到return View();自然返回的是默认的视图,即RsvpForm,继续去添加这个视图:在这个Action内右键 - 添加视图 - 勾选上“创建强类型视图” - 选择GuestResponse模型类(如果找不到就先按F6编译下项目)- 不使用模板类和脚本库,生成的View是:

@model SimpleMVC3Demo.Models.GuestResponse
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>RsvpForm</title>
</head>
<body>
<div>
</div>
</body>
</html>

注意第一行:@model SimpleMVC3Demo.Models.GuestResponse 这就是勾选强类型视图的好处,直接把强类型抛到了View里,其实手动写这一行也是一样的效果(同样需要编译项目)
继续完善RsvpForm这个视图,在body里去掉div然后添加表单和一些文本框下拉列表供用户填写信息:

    @using (Html.BeginForm("RsvpForm", "Home", FormMethod.Post))
{
<p>
Your name: @Html.TextBoxFor(x => x.Name)
</p>
<p>
Your email: @Html.TextBoxFor(x => x.Email)</p>
<p>
Your phone: @Html.TextBoxFor(x => x.Phone)</p>
<p>
Will you attend?
@Html.DropDownListFor(x => x.WillAttend, new[] {
new SelectListItem() {Text = "我会参加Party", Value = bool.TrueString},
new SelectListItem() {Text = "我不参加Party", Value = bool.FalseString}
}, "Choose an option")
</p>
<input type="submit" value="提交" />
}

注意看看强类型的好处就是页面上可以调用到其属性,这里的x => x.属性方式其实就是lambda表达式的写法,这里不用x,用任何字母都可以,前提是必须已经把强类型的抛到View里。

这就是这个表单提交的地址,其实就等于webForm里的:

<form action="/Home/RsvpForm" method="post">
<input type="text" name="username" />
<input type="text" name="userpwd" />
<input type="submit" value="提交" />
</form>

这个Form提交的地址是指定的HomeController下的RsvpForm,之前已经有一个:

public ViewResult RsvpForm()
{
return View();
}

其实提交表单处理的不是这个Action,这个是get请求的Action,需要另加一个post的Action(mvc里默认的action响应的是get方式的请求,用于请求页面内容,响应post请求的action一般是提交表单等):

[HttpPost]
public ViewResult RsvpForm(GuestResponse guestResponse)
{
return View("Thanks", guestResponse);
}

这只是个简单的Action,并没有对用户提交的表单内容进行保存,而是直接返回了一个Thanks视图,并且把用户对象,也就是用户在表单里填写的用户信息传到了Thanks这个视图,来看看这个用户对象guestResponse如何传递的:在这个HttpPost下面按F9加个断点,然后按F5调试下项目,当提交表单时,这个对象其实就已经有属性了:

很明显这个对象已经有值了,继续在Views目录下的Home目录上右键 - 添加视图 - 视图名称Thanks - 勾选强类型视图 - 不使用模板页和脚本库。ok,这个视图也拿到了传递过去的用户对象,其实就可以在body里输出一些友好的回复:

    <div>
<h1>
Thank you, @Model.Name!</h1>
@if (Model.WillAttend == true)
{
@:你能来真的太好了,饮料和零食都为你准备好了!
}
else
{
@:很遗憾你不能来。
}
</div>

注意看,Razor视图引擎里可以直接写if else逻辑语句。

写到这里该跑下程序了,再次编译下后按Ctrl + F5跑下程序。
第一个页面:

源码:

    <div>
下午好, WOrLd!!!
<p>
我们将举办一个Party<br />
</p>
<a href="/Home/RsvpForm">填表参加</a>
</div>

第二个页面:

源码:

<form action="/Home/RsvpForm" method="post">
     <p>
Your name: <input id="Name" name="Name" type="text" value="" />
</p>
<p>
Your email: <input id="Email" name="Email" type="text" value="" /></p>
<p>
Your phone: <input id="Phone" name="Phone" type="text" value="" /></p>
<p>
Will you attend?
<select id="WillAttend" name="WillAttend">
      <option value="">请选择</option>
      <option value="True">我会参加Party</option>
      <option value="False">我不参加Party</option>
    </select>
</p>
<input type="submit" value="提交" />
</form>

第三个页面:

源码:

    <div>
<h1>
Thank you, 汪杰!</h1>
你能来真的太好了,饮料和零食都为你准备好了!
</div>

注意看上面两个图的url地址一样,都是:localhost:1031/Home/RsvpForm
但是页面显示的内容不同,因为一个是get请求,一个提交表单是post请求,提交后被导向另一个视图了。

验证表单:刚才的表单就算任何都不填写也可以提交,显然不符合常理,验证需要三步,第一去模型类里定义验证规则:

[Required(ErrorMessage = "姓名不能为空")]
public string Name { get; set; } [Required(ErrorMessage = "邮箱地址不能为空")]
[RegularExpression(".+\\@.+\\..+", ErrorMessage = "请输入合法的邮箱地址")]
public string Email { get; set; } [Required(ErrorMessage = "电话不能为空")]
public string Phone { get; set; } [Required(ErrorMessage = "请选择是否参加")]
public bool? WillAttend { get; set; } //是否参加(可空类型)

这是Data Annotation标注的形式来验证的,如果还不知道Data Annotation为何物,建议先去了解一下
注:需要引用命名空间System.ComponentModel.DataAnnotations

第二去控制器里判断是否通过验证:

if (ModelState.IsValid)
{
return View("Thanks", guestResponse);
}
else
{
return View();
}

直接调用的ModelState.IsValid方法来验证模型是否通过验证。当然到这里还不算结束,第三去View里应用验证:
在using语句下面加上:@Html.ValidationSummary() 表示此表单需要验证,这时候如果表单数据不合法则不会被导向到Thanks视图。

到此,生成的html页面就又不同了,会有验证信息在里面,一旦用户输入的不符合在模型类里的定义,那么验证信息就会显示出来,看源码:

<form action="/Home/RsvpForm" method="post">
<div class="validation-summary-valid" data-valmsg-summary="true">
<ul><li style="display:none"></li></ul>
</div>
     <p>
Your name: <input data-val="true" data-val-required="姓名不能为空" id="Name" name="Name" type="text" value="" />
</p>
<p>
Your email: <input data-val="true" data-val-regex="请输入合法的邮箱地址" data-val-regex-pattern=".+\@.+\..+" data-val-required="邮箱地址不能为空" id="Email" name="Email" type="text" value="" /></p>
<p>
Your phone: <input data-val="true" data-val-required="电话不能为空" id="Phone" name="Phone" type="text" value="" /></p>
<p>
Will you attend?
<select data-val="true" data-val-required="请选择是否参加" id="WillAttend" name="WillAttend">
      <option value="">请选择</option>
      <option value="True">我会参加Party</option>
      <option value="False">我不参加Party</option>
     </select>
</p>
<input type="submit" value="提交" />
</form>

高亮错误信息行其实很简单,直接在RsvpForm视图里添加一个默认css的引用:

<link rel="Stylesheet" href="@Href("~/Content/Site.css")" type="text/css"/>

再提交非法表单信息就高亮了错误行:

其实提交表单的一刹那浏览器还是有刷新的,说明这是个服务器端验证,实际项目中更应该服务端和客户端双验证,后续会有详细演示。

本文源码

系列文章导航

 
 
分类: 5.MVC

facebook .net sdk 应用的更多相关文章

  1. 浅谈 facebook .net sdk 应用

    今天看了一篇非常好的文章,就放在这里与大家分享一下,顺便也给自己留一份.这段时间一直在学习MVC,另外如果大家有什么好的建议或者学习的地方,也请告知一下,谢谢. 这篇主要介绍如何应用facebook ...

  2. 使用Facebook的SDK判斷來訪者是否已經按讃并成為本站粉絲團的成員

    今天公司裡要做活動,其中有一項活動內容是要求來訪者按一下facebook粉絲團的讃,按了讃之後贈送現金.Facebook被墻大家眾所周知,在百度搜了一下發現因為被墻的原因導致國內涉及到Facebook ...

  3. 应用facebook .net sdk

    1.本博客主要介绍如何应用facebook .net SDK,实现发帖.点赞.上传照片视频等功能,更多关于facebook API,请参考:https://developers.facebook.co ...

  4. 零基础图文傻瓜教程接入Facebook的sdk

    零基础图文傻瓜教程接入Facebook的sdk 本人视频教程系类   iOS中CALayer的使用 0. 先解决你的 VPN FQ上外网问题,亲,解决这一步才能进行后续操作^_^. 1. 点击右侧链接 ...

  5. 手游服务器端接入facebook的SDK

    手游如果支持facebook登录,就要接入facebook的登录SDK.刚好工作中自己做了这一块的接入功能现在记录分享下来提供一个参考. 当前只是接入了登录这个功能,先简单的说说接入facebook登 ...

  6. 在Android上实现使用Facebook登录(基于Facebook SDK 3.5)

    准备工作: 1.       Facebook帐号,国内开发者需要一个vpn帐号(网页可以浏览,手机可以访问) 2.       使用Facebook的SDK做应用需要一个Key Hashes值. 2 ...

  7. 分享前端Facebook及Twitter第三方登录

    最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...

  8. Android Facebook和Twitter分享

    1. 背景 在年初的时候,公司的项目有个新的需求,在英文版的应用中加入Facebook和Twitter分享功能. 2. 完成情况 由于这个项目比较急,所以开发这个功能从预研到接入总共耗时一周.后来,在 ...

  9. Facebook

    Facebook登录为iOS Facebook的SDK为iOS提供了各种登录的经验,你的应用程序可以使用它来 ​​验证一个人.这份文件包括了所有你需要知道,以落实Facebook登录在你的iOS应用程 ...

随机推荐

  1. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  2. Objective-C马路成魔【12-分类和协议】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 分类与协议 ...

  3. 从头开始学JavaScript 笔记(一)——基础中的基础

    原文:从头开始学JavaScript 笔记(一)--基础中的基础 概要:javascript的组成. 各个组成部分的作用 . 一.javascript的组成   javascript   ECMASc ...

  4. HDU 4873 ZCC Loves Intersection(可能性)

    HDU 4873 ZCC Loves Intersection pid=4873" target="_blank" style="">题目链接 ...

  5. lcc之内存分配

    现在感觉这本书有些地方没有说透,如果自己的理解能力与基础知识够强的话,理解起来还好,如果不行的话,某些地方理解起来会相当的头疼. 现在来说说内存管理.当初看这一章的时候很快就过去了,感觉很多地方很好理 ...

  6. HTML5 五彩圆环Loading加载动画实现教程

    原文:HTML5 五彩圆环Loading加载动画实现教程 今天我们要来介绍一款效果很特别的HTML5 Loading加载动画,不像其他的Loading动画,这款Loading动画颜色很丰富,并且在转圈 ...

  7. JUnit介绍

    8.1.1  JUnit简介 JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强 大. 下面是JUnit一些特性的总结: — 提供的API可以让开发人员写出测试结果明 ...

  8. JAVA学习课第五十三届 — IO流程(七)File打靶 &amp; Properties设置

    一个.锻炼 深度遍历目录 深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈 对指定文件夹下列出全部内容(包括子文件夹的内容) PS:建议不要遍历C盘 import java. ...

  9. C++在struct与class差异

    在C++中,既能够用structkeyword进行类的定义,也能够用classkeyword进行类的定义,那么这两者究竟有什么差别呢? 唯一的一点差别是:struct和class的默认訪问权限不一样. ...

  10. [译]Java 设计模式之组合

    (文章翻译自Java Design Pattern: Composite) 组合模式相对来说是比较简单的,但是它在很多设计中被用到,比如SWT.Eclipse工作空间等等.它创建了一个可以通过唯一的方 ...