NancyFx框架中使用绑定模型

新建一个空的Web程序

然后安装Nuget库里面的包

  • Nancy
  • Nancy.Hosting.Aspnet
  • Nancy.ViewEnglines.Spark

并在Web应用程序里面添加Models,Module,Views三个文件夹

继续往Models文件夹里面添加Database,ModelBinders

然后往Models文件夹里面添加Customer类

        public int Id { get; set; }
public string Name { get; set; }
public DateTime RenewalDate { get; set; }

继续往Models文件夹里面添加Event类

        public int Id { get; set; }
public string Title { get; set; }
public string Location { get; set; }
public IEnumerable<int> Venues { get; set; }
public DateTime Time { get; set; }
public Event()
{
this.Title = "Lexan";
this.Location = "Lexan";
this.Time = DateTime.Now;
}

继续往Models文件夹里面添加User类

        public string Name { get; set; }
public string Address { get; set; }

然后往Database文件夹里面添加DB类

        public static List<Event> Events { get; private set; }
public static List<Customer> Customer { get; private set; } static DB()
{
Events = new List<Models.Event>();
Customer = new List<Models.Customer>();
}

然后往ModelBinders文件夹里面添加CustomerModelBinder类

//是否可以绑定到给定的模型类型
public bool CanBind(Type modelType)
{
return modelType == typeof(Customer);
}
//绑定到给定的模型类型
public object Bind(NancyContext context,Type modelType, object instance,BindingConfig configuration,params string[] blackList)
{
var customer = (instance as Customer) ?? new Customer();
customer.Name = customer.Name ?? context.Request.Form["Name"];
customer.RenewalDate = customer.RenewalDate == default(DateTime) ? context.Request.Form["RenewalDate"] : customer.RenewalDate;
return customer;
}

然后往Module里添加MainModule类

 public MainModule()
{
Get("/", Lexan =>
{
return "<a href='/events'>Events (默认模型绑定)</a><br><a href='/customers'>Customers (自定义模型绑定)</a><br><a href='/bindjson'>Users (JSON)</a></a><br><a href='/bindxml'>Users (XML)</a><br>";
});
}

然后往Module里添加CustomersModule类

 public CustomersModule() : base("/customers")
{
Get("/",Lexan=>
{
var model = DB.Customer.OrderBy(e=>e.RenewalDate).ToArray();
return View["Customers",model];
});
Post("/",Lexan=>
{
Customer model = this.Bind();
var models = this.Bind<Customer>();
DB.Customer.Add(model);
DB.Customer.Add(models);
return this.Response.AsRedirect("/Customers");
});
}

然后往Module里添加EventsModule类

 public EventsModule():base("/events")
{
Get("/",Lexan=>
{
var model = DB.Events.OrderBy(x=>x.Time).ToArray();
return View["Events",model];
});
Post("/",Lexan=>
{
Event model = this.Bind();
var models = this.Bind<Event>("Location");
DB.Events.Add(model);
DB.Events.Add(models);
return this.Response.AsRedirect("/Events");
});
}

然后往Module里添加JsonModule类

  public JsonModule()
{
Get("/bindjson",Lexan=>
{
return View["PostJson"];
});
Post("/bindjson",Lexan=>
{
User model = this.Bind();
var sb = new StringBuilder();
sb.AppendLine("绑定模型:");
sb.Append("类型:");
sb.AppendLine(model.GetType().FullName);
sb.Append("名字:");
sb.AppendLine(model.Name);
sb.Append("地址:");
sb.AppendLine(model.Address);
return sb.ToString();
});
}

然后往Module里添加XmlModule类

 public XmlModule()
{
Get("/bindxml",Lexan=>
{
return View["PostXml"];
});
Post("/bindxml",Lexan=>
{
var model = this.Bind<User>(x=>x.Name);
var sb = new StringBuilder();
sb.AppendLine("绑定模型:");
sb.Append("类型:");
sb.AppendLine(model.GetType().FullName);
sb.Append("名字:(这将是空的, 因为它被忽略)");
sb.AppendLine(model.Name);
sb.Append("地址:");
sb.AppendLine(model.Address);
return sb.ToString(); });
}

然后往根目录里面添加Bootstrapper类

然后往Views文件夹里面添加Customers.txt文件

然后把Customers.txt改成Customers.spark

添加如下内容

<viewdata model="ModelBindingDemo.Models.Customer[]"/>
<html>
<head>
<title>客户</title>
</head>
<body>
<h1>客户</h1>
<p>客户被添加了两次, 一个使用动态活页夹适配器, 另一个使用通用的.</p>
<p>当前客户:</p>
<ul>
<li each="var v in Model">
<a href="customer/${v.Id}"> ${v.Name} - ${v.RenewalDate.ToShortDateString()} </a>
</li>
</ul> <h2>添加另一个</h2>
<form method="POST" action="/customers">
<label for="Name">名字</label>
<input type="text" name="Name" />
<label for="Location">更新日期</label>
<input type="text" name="RenewalDate" />
<input type="submit"/>
</form>
</body>
</html>

同样的做法添加Event.txt添加成功后改成Event.spark

 并添加如下内容

<viewdata model="ModelBindingDemo.Models.Event[]"/>
<html>
<head>
<title>事件</title>
</head>
<body>
<h1>事件</h1>
<p>事件被添加两次, 一个使用动态活页夹适配器, 另一个使用通用的.</p>
<p>第二个有 ' 位置 ' 标记为黑名单, 因此应该显示为 ' 默认 '</p>
<p>当前事件:</p>
<ul>
<li each="var v in Model">
<a href="event/${v.Id}"> ${v.Title} - ${v.Location} </a> ${v.Time}
</li>
</ul> <h2>Add another</h2>
<form method="POST" action="/events">
<label for="Name">标题</label>
<input type="text" name="Title" />
<label for="Location">位置</label>
<input type="text" name="Location" /> <input type="checkbox" name="Venues" value="">地点 </input>
<input type="checkbox" name="Venues" value="">地点 </input>
<input type="checkbox" name="Venues" value="">地点 </input>
<input type="checkbox" name="Venues" value="">地点 </input> <label for="EventDate">时间</label>
<input type="text" name="Time" value="${System.DateTime.Now}"/>
<input type="submit"/>
</form>
</body>
</html>

 然后继续再Views文件夹里面添加PostJson.html

<html>
<head>
<title>JSON Post Test</title>
<script type="text/javascript">
$(function () {
var dat = "{\"Name\":\"This is the name\", \"Address\":\"This is the address\"}"; alert("将以下数据粘贴到 /bindjson:\n\n" + dat); $.ajax({
type: "POST",
url: "/bindjson",
contentType: "application/json",
data: dat,
success: function (data) {
alert("Response:\n" + data);
}
});
});
</script>
</head>
<body>
JSON Post
</body>
</html>

继续添加PostXml.html页面

<html>
<head>
<title>XML Post Test</title>
<script type="text/javascript">
$(function () {
var dat = "<User><Name>这是名字</Name><Address>这是地址</Address></User>"; alert("将以下数据粘贴到 /bindxml:\n\n" + dat); $.ajax({
type: "POST",
url: "/bindxml",
contentType: "application/xml",
data: dat,
success: function (data) {
alert("Response:\n" + data);
}
});
});
</script>
</head>
<body>
XML Post
</body>
</html>

最后修改Web.config配置文件

    <httpRuntime targetFramework="4.5.2"/>
<httpHandlers>
<add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" />
</httpHandlers>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<add name="Nancy" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" />
</handlers>
</system.webServer>

现在我们看看运行的结果

到这里就结束了,感谢你的欣赏,这篇也算介绍完了NancyFx2.0版本的基本使用,后期看看如果有空的话会继续更新,我们不见不散,哈哈哈!

NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)的更多相关文章

  1. NancyFx 2.0的开源框架的使用-Basic

    这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy ...

  2. NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)

    NancyFx框架的自定义模块 新建一个空的Web项目 然后通过NuGet库安装下面的包 Nancy Nancy.Hosting.Aspnet 然后添加Models,Module,Views三个文件夹 ...

  3. NancyFx 2.0的开源框架的使用-HosingOwin

    Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models, ...

  4. NancyFx 2.0的开源框架的使用-Authentication

    新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Mod ...

  5. NancyFx 2.0的开源框架的使用-Forms

    同样的像前面2篇博文一样,每个项目的开始基本都是建个空的Web项目 在NuGet库中安装以下几个NuGet包 Nancy Nancy.Authentication.Forms Nancy.Hostin ...

  6. NancyFx 2.0的开源框架的使用-Stateless

    同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹 添加Nuget包 在Models文件夹里面添加UserModel类 public string Use ...

  7. NancyFx 2.0的开源框架的使用-Stateless(二)

    继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西 接下来右键解决方案添加新项目,一样建一个空的Web项目 然后在StatelessDemoWeb项目里面添加Views文件夹,Sc ...

  8. NancyFx 2.0的开源框架的使用-AspnetBootstrapping

    新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...

  9. NancyFx 2.0的开源框架的使用-Caching

    新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...

随机推荐

  1. spring security 3.x 多页面登录配置入门教程

    最近在最shiro的多入口登录,搞了好久,就把spring security拿出来再炒一下,这是我以前在csdn写过的一篇博客. spring security 是一个权限控制的框架.可以很方便地实现 ...

  2. Executor以及线程池

    在应用程序中,总是会出现大量的任务,包括相同类型的和不同类型的.要快速处理这些任务,常见方法就是利用多线程,但是也不可能为每个任务都创建一个线程,这样内存也不够,并且线程的创建销毁开销很大.最好是少量 ...

  3. --save 和 --save-dev的区别

    --save是对生产环境所需依赖的声明(开发应用中使用的框架,库,比如jquery,bootstrap等) --save-dev是对开发环境所需依赖的声明(构建工具,测试工具,比如babel,gulp ...

  4. 一个只有99行代码的JS流程框架

    张镇圳,腾讯Web前端高级工程师,对内部系统前端建设有多年经验,喜欢钻研捣鼓各种前端组件和框架. 最近一直在想一个问题,如何能让js代码写起来更语义化和更具有可读性. 上周末的时候突发奇想,当代码在运 ...

  5. 【zzulioj 2135】 这里是天堂!

    先考虑当前情况可行与否: 如果当a>n或者b>m时是绝对不行的,概率为0: 当a+b<m+n时,k一定等于a+b,否则概率为0: 当a+b==m+n时,k>=a+n,否则概率为 ...

  6. Dubbo的使用简介

    Dubbo是什么 官方定义 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000, ...

  7. 基础才是重中之重~关于ThreadStatic和Quartz的一点渊源

    回到目录 ThreadStatic ThreadStatic是C#里的一个特性,它可以让你的字段在一个线程里有效,但你不能控制这个字段在何时被回收,即如果声明一个int32的字段为ThreadStat ...

  8. Vue 自定义图片懒加载指令v-lazyload

    Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍.以下将详细介绍如何实现自定义指令v-lazyload. 先看如何使用这个指令: &l ...

  9. 转Fiddler 构造http请求

    今天使用Fiddler构造一个POST请求,server端的PHP脚本的 $_POST数组中怎么也获取不到值,后来偶然发现是因为缺少了一个http头:Content-Type: application ...

  10. 纯css实现翻牌特效

    大家有没有看到过网上很炫的翻牌效果,牌正面对着我们,然后点击一下,牌就被翻过来了,效果很酷炫,是不是很想知道是怎么实现的么,代码很简单,跟着小编往下走. 先给大家介绍一下翻牌的原理: 1.父容器设置设 ...