动荡的五月互联网

mikel阅读(843)

阿里开出5月发单《阿里开出5月物流炒信罚单:23个天猫商家被清退

摘要:

新浪科技讯 5月4日消息,阿里巴巴集团近期开出5月首张炒信罚单,首批23个天猫商家被查实参与“物流刷单”,依据天猫平台有关规则,这些商家已被查封清退。

据悉,所谓“物流刷单”系指物流公司内部人员参与违规刷单、协助不法商家寄送空包件或提供不真实物流信息,从而提高商家成交量、信用等级,其特征是物流运单信息高度仿真,人工较难判别。

此次遭阿里打击的炒信商家包括天猫家装汽车、数码家电等多个类目。天猫规则部有关负责人对记者表示,其它凡涉事商家,将按照随后取证情况,查实一批就会按照天猫平台规则被处罚一批。

阿里巴巴搜索事业部有关负责人介绍,2014年底,该部门通过算法模型监测到一些物流数据异常。与此同时阿里其它部门经过人工巡查,确认某些物 流公司存在公司内部人员与刷单公司“里应外合”情况。阿里巴巴多个部门联合成立行动小组,剔除了涉及“炒信”的相关数据,并在搜索底层基础数据中,清洗掉 商家物流刷单引发的一切数据权重。此外,联合行动小组即时对物流数据异常的国通快递等十多家快递公司进行重点监控。

今年初汇集齐所有证据材料之后,行动小组找到国通快递等公司,在证据面前,后者承认确有刷单问题并愿意配合整改。此后菜鸟网络对外宣布,对13 家快递公司进行下线处罚,其中5月4日起正式关闭国通快递在线下单功能1个月,等其整改后再决定是否恢复服务。中通、圆通、申通、百世汇通、韵达等各快递 公司均对内部发出告示,要求禁止受理淘宝、天猫平台商家炒信快件。

阿里巴巴集团表示,面对一些不良商家不断变换炒信方式的新趋势,未来将对买卖家账号注册,到用户在阿里平台交易行为监控,再到物流、资金、评价维度等数据进行监控,建立覆盖交易、物流、资金“全链路”的监控与识别系统,保持打击炒信的高压态势。

在今年“2015卖家年会”上,阿里巴巴集团零售平台事业群总裁张建锋曾透露,一些卖家因为各种各样的目的,把精力花在炒信、刷单等“努力”上,5月起阿里会推出非常严厉的处罚措施,从商品的降权、店铺的降权,直至店铺的关闭。

阿里巴巴搜索事业部负责人也强调,要让不良商家倾家荡产,在打击炒信刷单方面对于所有大小商家一视同仁,落实张建锋在年初时的承诺。

天涯论坛公开转让书引起再一次的论坛生存问题讨论《网曝天涯社区《公开转让说明书》 传统BBS已沦陷

摘要:

随着微博、微信等移动社交媒体的迅速扩张,传统的BBS已经逐渐走向没落。现在看来,就连国内人气高涨的“天涯社区”也难抵这样的趋势。

最新消息,微博用户 @鬼文子 刚刚爆料,天涯社区疑似正在谋求转让,博文中附带了一张照片,其中显示了一份由天涯社区网络科技有限公司发布的《公开转让说明书》。

目前,天涯社区官方还未对此做出任何澄清,也尚未发布任何涉及转让的消息。

观点:

没有永远的盈利模式,同样也没有不透风的墙,阿里终于忍不住对天猫刷单下手治理,让人们觉得在情理之中,不过也感到很意外为什么是五月才开始?刷单已经被大家深恶痛绝得时候再来下猛药治理是不是有点儿晚了,从文字上阿里完全可以早就制止只是一直没作为,以至于连物流快递公司都被拉进刷单中的时候才开始治理,是不是很不合时宜?有点儿晚。

天涯作为老一辈的论坛大哥大,终于在无奈中做出了自己的决定,不管是真是假,反正论坛的模式还能走多远,如何寻找新的增长点,都是耐人寻味的一个问题。也是摆在各个论坛站长们心头的一根刺,大家都在寻找出路,可一直没有什么成功的案例,连老大哥都顶不住移动互联网的冲击了,还有谁能够说自己独孤求败?!

动荡的五月互联网,看似不相干的两件事儿,其实是关系生死存亡的一件事儿,那就是:如何持续的盈利活下去?

天猫不制止刷单歪风邪气,就会损坏电商的生态圈儿,就会有更多的恶性行为,放任不管不行,矫枉过正也不行,阿里也是左右为难,但是生存面前还是选择要严管了;天涯也是为了生存,在寻找出路无果的情况下,希望投奔个好东家,来点儿新鲜血液找点儿新的盈利模式出来,实属无奈也是必然。

ASP.NET Session的实现原理分析 - Sunnier - 博客园

mikel阅读(857)

来源: ASP.NET Session的实现原理分析 – Sunnier – 博客园

ASP.NET Session的实现原理分析

用户向服务器提交请求时,服务器都会给每个用户分配一个SessionId,保存在用户浏览器的Cookies中,SessionId是全局的,也就是说只要Cookies还存在,服务器就会认为这是同一个用户,从而实现了每个用户都有自己独立的全局Session域。当用户再去请求的时候,在http头把这个SessionID的Cookie发到服务器端,服务器就去找这个SessionID,如果找到了。就证明这个用户的状态是存在的。

 

我们可以通过以下实验更清除的了解Session:

 

点击按钮后页面回传,但是输出的依然是相同的SessionId

在浏览器的Cookies中我们找到的服务器在客户端为我们这个用户保存的SessionId,每次我们请求时服务器就以这个SessionId作为key在服务器端的Session中寻找属于我们这个用户的Session域。

当办公系统遇上时间管理

mikel阅读(975)

当办公系统遇上时间管理于是故事就变得有意思了,其实很多时候我们都在与各种各样的事件打交道,然后这些事件又无一例外都分散着整个一天的时间,于是不可避免的时间管理技能得强弱直接应该的我们的工作和生活。

很多时候我们都会发现自己一天没完成几件事儿就过去了,其实就是时间管理不当造成的结果,被过多的事情缠住然后不懂得安排时间处理,造成混乱,尽管很忙,但是没有效果和效率。

如果有一个辅助你并教育你如何管理时间的系统会让你事倍功半,其实这个挺简单的,将事情分成轻重缓急来,然后按照安排计划的执行并保证每天清理下事件采集箱,保持节奏,有条不紊的进行工作和生活,会让事情变得简单也让自己变得轻松些。

但是很多市面上的办公系统只重视公司各项管理,而恰恰最应该重视的员工的工作效率和时间管理都被认为是不入流的需求给人为屏蔽掉了,我感觉应该员工的时间管理功能才是整个办公系统的核心所在,没有好的时间管理,无法达到提高工作效率,合理管理公司事务和业务的目的。

所以说当办公系统遇上时间管理,时间管理彻底颠覆了过去的传统的办公系统的功能结构,办公系统不再是冷冰冰的工具,而是人的帮手或者说老师,拥有智能分析和安排事务的能力,让每个人都喜欢上用它处理日常工作和生活的各种事务,这才是未来办公系统的发展方向。

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单 - ymnets - 博客园

mikel阅读(1375)

来源: 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单 – ymnets – 博客园

系列目录

设计表单是比较复杂的一步,完成一个表单的设计其实很漫长,主要分为四步。

开始之前先说说表的结构。

其实表Flow_Form与Flow_FormContent设计是有一个缺陷的。我总共是设置最高26个字段从A~Z如果超过26个字段的表单是属于硬编码的。但是我认为26个字段已经足够

因为这里我是单表模式比起表关联无限字段理论上性能会更加快,特别是当数据库申请带到千万级数据的时候(你自己可以设计更加灵活的表单管理)

Flow_Form的A~Z对应的是Flow_FlowAttr表中的数据,

Flow_FormContent表中的数据就是用户对表单的申请内容。同样从A~Z对应。这个表设计也有缺陷,我把内容全部设置为 varchar(2048)字段太大,可以根据自己的扩展来确定内容是最佳的方式,比如A-F是大字段,G-L设置的是中级长度的字段,M-O是数字的字 段等等

准备开始

1.新建控制器FormController(用代码生成器即可)

新建视图Create.cshtml,这里我设计了一个手风琴,设计表单的同时设计字段

把代码生成器生成的Form表单的的Create代码放到

第一步:设计表单里面

第二步添加字段,添加字段是一个DropDownList+easyui-combogrid来组成。

具体代码实现如下


@model App.Models.Flow.Flow_FormModel
@using App.Common;
@using App.Models.Flow;
@using App.Admin;
@using App.Models.Sys;
@{
ViewBag.Title = "创建";
Layout = "~/Views/Shared/_Index_LayoutEdit.cshtml";
List<permModel> perm = (List<permModel>)ViewBag.Perm;
if (perm == null)
{
perm = new List<permModel>();
}
}

<script type="text/javascript">
$(function () {
jQuery("#accordion").accordion({ //初始化accordion
fillSpace: true,
fit: false,
border: false,
animate: false
});

$("#btnSave").click(function () {
if ($("form").valid()) {
$.ajax({
url: "@Url.Action("Create")",
type: "Post",
data: $("form").serialize(),
dataType: "json",
success: function (data) {
if (data.type == 1) {
window.parent.frameReturnByMes(data.message);
window.parent.frameReturnByReload(true);
window.parent.frameReturnByClose()
}
else {
window.parent.frameReturnByMes(data.message);
}
}
});
}
return false;
});
$("#btnReturn").click(function () {
window.parent.frameReturnByClose();
});
//改变字段列表
$("#TypeName").change(function () {
$('#attrVal').val("");
$('#formAttrComboGrid').combogrid('setValue', '').combogrid('clear');
$("#formAttrComboGrid").combogrid('grid').datagrid("load", { queryStr: $("#TypeName").val() });
});
});
//添加一个字段到表单
function AddAttr() {

var currentValue= $('#attrVal').val();
if (currentValue == "") {
$.messageBox5s('提示', "请选择要添加的字段!");
}
var charNo = $("#AttrList tr").size()+1;//第几个字符
if (charNo > 26)
{
$.messageBox5s('提示', "目前设计最高26个字段!");
return;
}
var b = false;
$("#AttrList input[type='hidden']").each(function (i) {//判断是否有重复的项目
if ($(this).val() == currentValue)
{
b = true;
return;
}
});
if (b)
{
$.messageBox5s('提示', "已经有重复的项目了!");
return;
}
var grid = $("#formAttrComboGrid").combogrid("grid");//获取表格对象
var row = grid.datagrid('getSelected');//获取行数据
var currentChar = "Attr" + getChar(charNo);//获取当前的字母
var example = getExample(row.AttrType);
//添加到候选区
$("#AttrList").append("<tr id='tr" + currentChar + "'><td style='text-align:right'>" + row.Title + ":</td>" +
"<td>" + example + "<input id='" + currentChar + "' name='" + currentChar + "' type='hidden' value='" + currentValue + "' /></td><td><a href=\"javascript:deleteCurrentTR('tr" + currentChar + "');\">[删除]</a></td></tr>");
//设置combogrid为空
$('#formAttrComboGrid').combogrid('setValue', '');
}
function deleteCurrentTR(c)
{
$.messager.confirm('提示', '删除字段吗?', function (r) {
if (r) {
$("#" + c).remove();

}
});
}

function getExample(v)
{
switch (v)
{
case "文本": return "<input type='text' />";
case "多行文本": return "<textarea></textarea>";
case "数字": return "<input type='text' />";
case "日期": return "<input type='text' />";
}
}

function getChar(i)
{
switch (i)
{
case 1: return "A"; break;
case 2: return "B"; break;
case 3: return "C"; break;
case 4: return "D"; break;
case 5: return "E"; break;
case 6: return "F"; break;
case 7: return "G"; break;
case 8: return "H"; break;
case 9: return "I"; break;
case 10: return "J"; break;
case 11: return "K"; break;
case 12: return "L"; break;
case 13: return "M"; break;
case 14: return "N"; break;
case 15: return "O"; break;
case 16: return "P"; break;
case 17: return "Q"; break;
case 18: return "R"; break;
case 19: return "S"; break;
case 20: return "T"; break;
case 21: return "U"; break;
case 22: return "V"; break;
case 23: return "W"; break;
case 24: return "S"; break;
case 25: return "Y"; break;
case 26: return "Z"; break;
default: break;
}
}

</script>
<div class="mvctool bgb">
@Html.ToolButton("btnSave", "icon-save", "保存", perm, "Save", true)
@Html.ToolButton("btnReturn", "icon-return", "返回", false)
</div>



@using (Html.BeginForm())
{
<div id="accordion" class="easyui-accordion">
<div title="第一步:设计表单" style="overflow: auto; padding: 10px;">
@Html.HiddenFor(model => model.Id)
<table class="fromEditTable setTextWidth300">
<tbody>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.Name):
</td>
<td style="width: 310px">
@Html.EditorFor(model => model.Name)
</td>
<td>@Html.ValidationMessageFor(model => model.Name)</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.Remark):
</td>
<td style="width: 310px">
@Html.TextAreaFor(model => model.Remark, 5, 80, new { })
</td>
<td>@Html.ValidationMessageFor(model => model.Remark)</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.UsingDep):
</td>
<td style="width: 310px">
@Html.EditorFor(model => model.UsingDep)
</td>
<td>@Html.ValidationMessageFor(model => model.UsingDep)</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.TypeId):
</td>
<td style="width: 310px">
@Html.DropDownListFor(model => model.TypeId, ViewBag.FlowType as SelectList)
</td>
<td>@Html.ValidationMessageFor(model => model.TypeId)</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.State):
</td>
<td style="width: 310px">
@Html.CheckBoxFor(model => model.State, new { @checked = true })
</td>
<td>@Html.ValidationMessageFor(model => model.State)</td>
</tr>
<tr>
<td>
<div style="float: right" class="pic_204"></div>
</td>
<td colspan="2" class="gray">注:设计好表单和字段才能组成一个完整的表单,设计好表单后才能设计步骤</td>
</tr>
</tbody>
</table>
</div>
<div title="第二步:添加字段" style="overflow: auto;">
<table class="fromEditTable setTextWidth300 bgb">
<tr>
<td style="width:40px; text-align: right;">类别:
</td>
<td style="width: 110px;">
@Html.DropDownListFor(model => model.TypeName, ViewBag.FlowType as SelectList, new { @style = "width:100px;" })
</td>
<td style="width:40px; text-align: right;">字段:
</td>
<td style="width: 210px">
<input id="attrVal" name="attrVal" type="hidden" />
<select class="easyui-combogrid" style="width:200px" id="formAttrComboGrid" data-options="
panelWidth: 470,
idField: 'Id',
textField: 'Title',
rownumbers: true,//行号
url: '@Url.Action("GetFormAttrList")?page=1&sort=Id&rows=1000&order=desc',
page:1,
columns: [[
{ field: 'Id', title: 'ID', width: 80, hidden: true },
{ field: 'Title', title: '字段标题', width: 80, sortable: true },
{ field: 'Name', title: '英文名称', width: 80, sortable: true },
{ field: 'AttrType', title: '类型', width: 80, sortable: true },
{ field: 'CheckJS', title: '校验脚本', width:50, sortable: true },
{field: 'CreateTime', title: '创建时间', width: 80, sortable: true }
]],
onClickRow: function (index, data) {
var value =  $('#formAttrComboGrid').combogrid('getValue');
$('#attrVal').val(value);

},
onLoadSuccess:function (data) {

},
fitColumns: true
">
</select>
</td>
<td>
<a href="javascript:AddAttr();" class="easyui-linkbutton" data-options="iconCls:'icon-add'">添加</a>
</td>
</tr>
</table>

<table id="AttrList" class="fromEditTable setTextWidth300">

</table>
</div>
</div>
}

FormController核心代码


[HttpPost]
public JsonResult GetFormAttrList(GridPager pager, string queryStr)
{
List<Flow_FormAttrModel> list = attrBLL.GetList(ref pager, queryStr);
var json = new
{
total = pager.totalRows,
rows = (from r in list
select new Flow_FormAttrModel()
{
Id = r.Id,
Title = r.Title,
Name = r.Name,
AttrType = r.AttrType,
CheckJS = r.CheckJS,
TypeId = r.TypeId,
CreateTime = r.CreateTime

}).ToArray()

};

return Json(json);
}

代码分析:

主要难点在切换类表需要重新加载combogrid,然后根据选择的字段组成表单。

利用前端技术控制,进行字段类表的筛选获得字段。再添加字段的ID到隐藏的DIV,最后序列化整张表单保存。

整个工作流中,前端的技术代码量远超后台代码。所以关注点都在前端代码中

作者:YmNets
出处:http://ymnets.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

.net 模拟登陆 post https 请求跳转页面 - 拾不起的回忆 - 博客园

mikel阅读(962)

来源: .net 模拟登陆 post https 请求跳转页面 – 拾不起的回忆 – 博客园

AllowAutoRedirect property is true, the Referer property is set automatically when the request is redirected to another site.”>如果 AllowAutoRedirect 属性为 true,则 Referer 属性在请求被重定向到另一个站点时自动设置。

Referer HTTP header, set the Referer property to null.”>若要清除 RefererHTTP 标头,请将 Referer 属性设置为 null。
如果设置了  Referer 则 指定到某个站点. 被这东西小坑了一下 涨姿势。


private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受安全证书
}

private void test()
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
CookieCollection _cookies = null; //后续使用
var addRess = "https://xxxxxxxxxx";
var data = "account=xxxxxxx&password=xxxxx";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(addRess);
request.CookieContainer = new CookieContainer();
request.Timeout = 1000 * 60;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.AllowAutoRedirect = true;
request.Referer = addRess;

byte[] bs = Encoding.UTF8.GetBytes(data);
HttpWebResponse response = null;
StreamReader myStreamReader = null;
Stream myRequestStream = null;
request.ContentLength = bs.Length;
string retString = string.Empty;
try
{
using (myRequestStream = request.GetRequestStream())
{
myRequestStream.Write(bs, 0, bs.Length);
myRequestStream.Close();
}
response = (HttpWebResponse)request.GetResponse();
_cookies = response.Cookies;
using (Stream myResponseStream = response.GetResponseStream())
{
using (myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("BIG5")))
{
retString = myStreamReader.ReadToEnd();
}
}
}
catch (Exception)
{

throw;
}
finally
{
if (myRequestStream != null)
{
myRequestStream.Close();
}
if (response != null)
{
response.Close();
}
if (myStreamReader != null)
{
myStreamReader.Close();
}
}
}

支付宝和微信的线下超市之争

mikel阅读(1132)

原文《支付宝和微信支付又杠上了:抢占线下超市》 ,摘要:

近期,支付宝钱包和微信支付的线下超市争夺战愈演愈烈,两家纷纷使出补贴优惠杀手锏,不光是国内连锁超市争相接入支付宝或微信支付,诸如家乐福这样的国 际连锁巨头也赶上这一潮流。有意思的是,支付宝和微信支付近日都把家乐福看作“VIP客户”,而家乐福也表示一个都不能少,两家支付都要用。

4月28日,支付宝钱包宣布已经与商超巨头华润万家、家乐福达成合作。华润万家旗下的包括华润万家、华润苏果、欢乐颂、Ole’、blt等多个 商超品牌将全线接入支付宝钱包支付,首批江苏、江西、浙江三地的1000多家超市、便利店已经完成接入。而家乐福北京、上海、杭州的所有门店也已支持支付 宝钱包付款。

当然要想让用户使用移动支付,补贴是少不了的,这也是互联网公司惯用的玩法。想要红包的小伙伴们,可要注意这几天的优惠信息了。华润万家表示, 从4月28日起,南京、江西、浙江三地的1000多家门店将上线长达一个月的9折活动。用户首次用支付宝钱包付款可想9折优惠,5元封顶。每个用户有一次 9折机会,支付成功后可参与抽奖,最高可获得100元的购物红包。

而另一商超巨头家乐福表示,从5月1日开始,北京、上海、杭州的所有门店将上线同样长达一个月的折扣优惠:每周五、周六、周日使用支付宝付款满50元立减5元。而周一至周四,家乐福用支付宝钱包付款可参与抽奖,最高可获得100元购物红包。

微信支付不甘落后,欲打造智慧超市

4月22日,微信支付与家乐福中国(以下简称家乐福)正式达成全面合作,家乐福全国237家门店将陆续接入微信支付。广州、深圳的12家门店将 在5月上旬首批接入微信支付,第二批包括北京、上海、沈阳、成都、杭州、武汉、重庆等城市,将在5月下旬逐步上线,同时有更多城市正加速推进中,预计不久 即可实现覆盖家乐福全国门店。

此前,微信曾推出“周二微信支付日”,即使用微信刷卡支付,即可享受支付10元以上(不含10元)立送10元代金券的优惠。

微信方面称,以“微信支付+微信公众账号”为中心的微信智慧超市解决方案,将围绕超市售前、售中、售后等环节,帮助家乐福等商超建立与用户的全方位连接。 未来,或许用户仅仅带着手机,就能在家乐福购物、领取优惠券,通过虚拟会员卡享受会员优惠,甚至通过微信公众号与家乐福互动,享受电商、客服等在线增值服 务。

移动支付场景之争

无论是使用支付宝钱包还是微信支付,都大大便利了用户的购买流程。过去用户找卡、等待店员刷卡、签字确认往往需要1分钟左右,现金找零遇上柜台 零钱不足则要耗时更久。用户在门店购物结账时,收银条码枪扫一下支付宝或者微信付款码,用户就完成了付款,整个过程只需3秒钟。和现金支付相比,支付宝钱 包付款无需找零、没有假币,更加简单方便。

而醉翁之意不在此,支付宝和微信都希望能够拓展线下移动支付场景,增加用户的黏性。从春节红包大战,到滴滴快的分别使用微信和支付宝的支付方 式,无不是在拓展各自的支付版图。未来围绕支付场景的争夺会更加激烈,而谁能在用户的衣食住行中占据更多的场景,谁就能在这场移动支付大战中占据领先地 位。

而对于商超而言,选择与支付宝钱包和微信支付合作,也是为企业的服务升级和O2O转型做热身,借生活场景的扩大,培养顾客的消费习惯,打造O2O交易闭环。(本文首发钛媒体)

观点:

不管是微信还是支付宝都是醉温之意不在酒,作为O2O的最后一环,也是致命的一环,支付永远都是必不可少必须提上台面儿上来的环节,没有支付构不成闭环,也就无从谈起从线上到线下,所以说从支付宝和微信的大笔投入都是在教育用户,像滴滴和快的那样在培育市场。

可见各家都在盯着O2O这块蛋糕,却不知道如何下嘴,从支付发力无疑是利润最大的环节,光那么多超市一天的资金流水就够阿里和微信的那些红包钱了,不断有热钱流入也就盘活儿余额宝等相关理财产品的资金问题,可是用户习惯不是一天两天养成的,毕竟大家习惯了打车支付、团购支付、网购支付,手机支付也慢慢习惯了,可超市买东西用支付宝支付还是个新事物,需要教育市场使用起来,还需要个过程。不过可见马云和腾讯都抓住了O2O的命脉,把握住支付就把握住资金和交易。

Asp.net MVC 多语言应用 - finly - 博客园

mikel阅读(1118)

来源: Asp.net MVC 多语言应用 – finly – 博客园

这里以Mvc3模版项目的登录页为例,简单说一下过程:

首先准备资源文件,即语言包。为web site项目添加Resource文件夹,然后在Resource文件夹下添加两个resx文件

命令行工具ResGen.exe将这两个resx文件生成同名的resources文件,如zh-CN.resources、en-US.resources,生成后将这两个resources文件放到Resource目录下

写一个静态getLang

<div class="container">
<div class="line number1 index0 alt2"><code class="csharp keyword">namespace</code> <code class="csharp plain">System.Web.Mvc</code></div>
<div class="line number2 index1 alt1"><code class="csharp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="csharp spaces">    </code><code class="csharp keyword">using</code> <code class="csharp plain">System.Collections;</code></div>
<div class="line number4 index3 alt1"><code class="csharp spaces">    </code><code class="csharp keyword">using</code> <code class="csharp plain">System.Resources;</code></div>
<div class="line number5 index4 alt2"><code class="csharp spaces">    </code><code class="csharp keyword">using</code> <code class="csharp plain">System.Linq;</code></div>
<div class="line number6 index5 alt1"></div>
<div class="line number7 index6 alt2"><code class="csharp spaces">    </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp keyword">class</code> <code class="csharp plain">LocalizationHelper</code></div>
<div class="line number8 index7 alt1"><code class="csharp spaces">    </code><code class="csharp plain">{</code></div>
<div class="line number9 index8 alt2"><code class="csharp spaces">        </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp keyword">string</code> <code class="csharp plain">Lang(</code><code class="csharp keyword">this</code> <code class="csharp plain">HtmlHelper html, </code><code class="csharp keyword">string</code> <code class="csharp plain">key)</code></div>
<div class="line number10 index9 alt1"><code class="csharp spaces">        </code><code class="csharp plain">{</code></div>
<div class="line number11 index10 alt2"><code class="csharp spaces">            </code><code class="csharp keyword">return</code> <code class="csharp plain">GetLang(key);</code></div>
<div class="line number12 index11 alt1"><code class="csharp spaces">        </code><code class="csharp plain">}</code></div>
<div class="line number13 index12 alt2"></div>
<div class="line number14 index13 alt1"><code class="csharp spaces">        </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp keyword">string</code> <code class="csharp plain">GetLang(</code><code class="csharp keyword">string</code> <code class="csharp plain">key)</code></div>
<div class="line number15 index14 alt2"><code class="csharp spaces">        </code><code class="csharp plain">{</code></div>
<div class="line number16 index15 alt1"><code class="csharp spaces">            </code><code class="csharp keyword">var</code> <code class="csharp plain">filePath = HttpContext.Current.Server.MapPath(</code><code class="csharp string">"~/Resource"</code><code class="csharp plain">);</code></div>
<div class="line number17 index16 alt2"><code class="csharp spaces">            </code><code class="csharp keyword">string</code> <code class="csharp plain">language = HttpContext.Current.Session[</code><code class="csharp string">"CurrentLanguage"</code><code class="csharp plain">] == </code><code class="csharp keyword">null</code> <code class="csharp plain">?</code></div>
<div class="line number18 index17 alt1"><code class="csharp spaces">                </code><code class="csharp string">"zh-CN"</code> <code class="csharp plain">: HttpContext.Current.Session[</code><code class="csharp string">"CurrentLanguage"</code><code class="csharp plain">].ToString();</code></div>
<div class="line number19 index18 alt2"><code class="csharp spaces">            </code><code class="csharp keyword">string</code> <code class="csharp plain">resxPath = </code><code class="csharp keyword">string</code><code class="csharp plain">.Format(</code><code class="csharp string">@"{0}\{1}.resources"</code><code class="csharp plain">, filePath, language);</code></div>
<div class="line number20 index19 alt1"><code class="csharp spaces">            </code><code class="csharp plain">ResourceReader reader = </code><code class="csharp keyword">new</code> <code class="csharp plain">ResourceReader(resxPath);</code></div>
<div class="line number21 index20 alt2"><code class="csharp spaces">            </code><code class="csharp keyword">var</code> <code class="csharp plain">entry = reader.Cast&lt;DictionaryEntry&gt;().FirstOrDefault&lt;DictionaryEntry&gt;(x =&gt; x.Key.ToString() == key);</code></div>
<div class="line number22 index21 alt1"><code class="csharp spaces">            </code><code class="csharp plain">reader.Close();</code></div>
<div class="line number23 index22 alt2"><code class="csharp spaces">            </code><code class="csharp keyword">return</code> <code class="csharp plain">entry.Value == </code><code class="csharp keyword">null</code> <code class="csharp plain">? </code><code class="csharp string">""</code> <code class="csharp plain">: (</code><code class="csharp keyword">string</code><code class="csharp plain">)entry.Value;</code></div>
<div class="line number24 index23 alt1"><code class="csharp spaces">        </code><code class="csharp plain">}</code></div>
<div class="line number25 index24 alt2"></div>
<div class="line number26 index25 alt1"><code class="csharp spaces">        </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp keyword">string</code> <code class="csharp plain">GetLanguage(</code><code class="csharp keyword">this</code> <code class="csharp plain">HtmlHelper html)</code></div>
<div class="line number27 index26 alt2"><code class="csharp spaces">        </code><code class="csharp plain">{</code></div>
<div class="line number28 index27 alt1"><code class="csharp spaces">            </code><code class="csharp keyword">return</code> <code class="csharp plain">HttpContext.Current.Session[</code><code class="csharp string">"CurrentLanguage"</code><code class="csharp plain">].ToString();</code></div>
<div class="line number29 index28 alt2"><code class="csharp spaces">        </code><code class="csharp plain">}</code></div>
<div class="line number30 index29 alt1"><code class="csharp spaces">    </code><code class="csharp plain">}</code></div>
<div class="line number31 index30 alt2"><code class="csharp plain">}</code></div>
<div class="line number31 index30 alt2">

 第二步、为动态切换语言,要在Global.asax文件中添加Application_AcquireRequestState事件,如:

复制代码

</div>
<div class="cnblogs_code_toolbar">
<pre>protected void Application_AcquireRequestState(object sender, EventArgs e)
        {
            if (HttpContext.Current.Session != null)
            {
                System.Globalization.CultureInfo ci =
                    (System.Globalization.CultureInfo)this.Session["CurrentLanguage"];
                if (ci == null)
                {
                    ci = new System.Globalization.CultureInfo(Request.UserLanguages[0].ToString());
                    this.Session["CurrentLanguage"] = ci;
                }
                System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
                System.Threading.Thread.CurrentThread.CurrentCulture =
                    System.Globalization.CultureInfo.CreateSpecificCulture(ci.Name);
            }
        }</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="http://www.mikel.cn/wp-content/uploads/2015/04/copycode29.gif" alt="复制代码" /></a></span></div>
<div class="cnblogs_code_toolbar">
第三步、在HomeController中添加ChangeLanguage方法,很简单、就一句代码,如:
</div>
<div class="cnblogs_code_toolbar">
<div class="container">
<div class="line number1 index0 alt2"><code class="csharp keyword">public</code> <code class="csharp plain">JsonResult ChangeLanguage()</code></div>
<div class="line number2 index1 alt1"><code class="csharp spaces">       </code><code class="csharp plain">{</code></div>
<div class="line number3 index2 alt2"><code class="csharp spaces">           </code><code class="csharp keyword">string</code> <code class="csharp plain">aa = Request[</code><code class="csharp string">"language"</code><code class="csharp plain">];</code></div>
<div class="line number4 index3 alt1"><code class="csharp spaces">           </code><code class="csharp plain">Session[</code><code class="csharp string">"CurrentLanguage"</code><code class="csharp plain">] = </code><code class="csharp keyword">new</code> <code class="csharp plain">System.Globalization.CultureInfo(Request[</code><code class="csharp string">"language"</code><code class="csharp plain">]);</code></div>
<div class="line number5 index4 alt2"><code class="csharp spaces">           </code><code class="csharp keyword">return</code> <code class="csharp plain">Json(</code><code class="csharp string">"操作成功!"</code><code class="csharp plain">, JsonRequestBehavior.AllowGet);</code></div>
<div class="line number6 index5 alt1"><code class="csharp spaces">       </code><code class="csharp plain">}</code></div>
<div class="line number6 index5 alt1">

ASP.NET MVC 5 Web编程4 -- Razor视图引擎 - hangwei - 博客园

mikel阅读(1203)

来源: ASP.NET MVC 5 Web编程4 — Razor视图引擎 – hangwei – 博客园

Razor简介

Razor是ASP.NET新增的一个视图引擎,由微软全球最年轻的副总裁,有着”ASP.NET之父”称呼的Scott Guthrie主导的团队开发。

主导Razor开发的Scott Guthrie,毕业于美国杜克大学。现任微软云计算与企业级产品工程部执行副总裁。

Razor对传统aspx页面的写法和页面渲染能力提出了反思,所以它在代码书写和HTML生成方面都进行了优化。Rzaor的设计目标遵循以下几点:

a). 尽量减少代码

b). 上手快,只需要现有的编程语言和基本的HTML知识

c). 可以使用记事本编写

d). 便于单元测试

Rzaor视图引擎页面以.cshtml(或.vbhtml)文件后缀结尾,是ASP.NET MVC 5默认使用的页面展现形式。

Razor与.aspx视图引擎对比

为了有一个直观的认识,我们先来看一个简单的用户管理页面的实现:

假定上图的页面呈现效果就是我们的最终目标。先来看Razor实现的页面:

<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="http://www.mikel.cn/wp-content/uploads/2015/04/copycode16.gif" alt="复制代码" /></a></span></div>
<pre>@{
    Layout = null;
}

@model IEnumerable&lt;MVC5Demo.Models.UserInfoViewModel&gt;

&lt;!DOCTYPE html&gt;

&lt;html&gt;
&lt;head&gt;
    &lt;meta name="viewport" content="width=device-width" /&gt;
    &lt;link href="~/Content/bootstrap.min.css" rel="stylesheet" /&gt;
    &lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div&gt;
        @Html.ActionLink("新增", "Add", "UserInfo")
        &lt;hr /&gt;
        &lt;h3&gt;用户信息列表&lt;/h3&gt;
        &lt;div class="table-responsive"&gt;
            &lt;table class="table table-striped table-bordered"&gt;
                &lt;thead&gt;
                    &lt;tr&gt;
                        &lt;th&gt;姓名&lt;/th&gt;
                        &lt;th&gt;性别&lt;/th&gt;
                        &lt;th&gt;年龄&lt;/th&gt;
                        &lt;th&gt;部门&lt;/th&gt;
                        &lt;th&gt;操作&lt;/th&gt;
                    &lt;/tr&gt;
                &lt;/thead&gt;
                &lt;tbody&gt;
                    @foreach (var item in Model) { 
                    &lt;tr&gt;
                        &lt;td&gt;@Html.DisplayFor(p =&gt; item.UserName)&lt;/td&gt;
                        &lt;td&gt;@(item.Sex == 0 ? "女" : "男")&lt;/td&gt;
                        &lt;td&gt;@Html.DisplayFor(p =&gt; item.Age)&lt;/td&gt;
                        &lt;td&gt;@Html.DisplayFor(p =&gt; item.Dept)&lt;/td&gt;
                        &lt;td&gt;@Html.ActionLink("编辑", "Edit", "UserInfo", new { id=item.UserID.ToString() },null) @Html.ActionLink("删除", "Delete", "UserInfo", new { id = item.UserID.ToString() }, new { onclick="return confirm('确认删除"+item.UserName+"的记录?');" })&lt;/td&gt;
                    &lt;/tr&gt;
                    }
                &lt;/tbody&gt;
            &lt;/table&gt;
        &lt;/div&gt;

    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

同时贴出传统aspx页面的代码(注:样式代码部分省略):

&lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MVC5Demo.WebForms.UserInfo.WebForm1" %&gt;

&lt;!DOCTYPE html&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head runat="server"&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;
    &lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form id="form1" runat="server"&gt;
        &lt;asp:LinkButton runat="server" Text="新增" PostBackUrl="~/add.aspx" /&gt;
    &lt;div style="height: 267px"&gt;
        &lt;asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" &gt;
            &lt;Columns&gt;
                &lt;asp:BoundField DataField="UserName" HeaderText="姓名" /&gt;
                &lt;asp:BoundField DataField="Sex" HeaderText="性别" /&gt;
                &lt;asp:BoundField DataField="Age" HeaderText="年龄" /&gt;
                &lt;asp:BoundField DataField="Dept" HeaderText="部门" /&gt;
                &lt;asp:CommandField HeaderText="编辑" ShowEditButton="true" /&gt;
                &lt;asp:CommandField HeaderText="删除" ShowDeleteButton="true" /&gt;
            &lt;/Columns&gt;
        &lt;/asp:GridView&gt;
    &lt;/div&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;

站在Razor的角度,

与传统aspx页面实现的代码不同,主要是以下几点:

1. 没有使用”GridView” 服务器控件(或者说没有这样的控件可以使用);

2. 使用@符号代替<%= %>来访问服务器代码;

3. 使用MVC提供的HTML辅助函数来渲染页面(代替服务器控件形式);

4. 其他不同点(如页头)。

可以看到,Razor的页面处理更”精细”,在页面展示上有点类似jsp(或者说回到了asp?),你需要具备基本的HTML知识(如画Table),因为”视图设计器”,”服务器控件”这些你曾经熟悉的东西,”不存在”了。

我们再来看看两种视图引擎生成的HTML源代码的差异。先来看Razor页面生成的HTML:


&lt;!DOCTYPE html&gt;

&lt;html&gt;
&lt;head&gt;
&lt;meta name="viewport" content="width=device-width" /&gt;
&lt;link href="/Content/bootstrap.min.css" rel="stylesheet" /&gt;
&lt;title&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div&gt;
&lt;a href="/UserInfo/Add"&gt;新增&lt;/a&gt;
&lt;hr /&gt;
&lt;h3&gt;用户信息列表&lt;/h3&gt;
&lt;div class="table-responsive"&gt;
&lt;table class="table table-striped table-bordered"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;部门&lt;/th&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lili&lt;/td&gt;
&lt;td&gt;女&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Human Resource&lt;/td&gt;
&lt;td&gt;&lt;a href="/UserInfo/Edit/e92cfb5c-e81a-4cfc-9d85-1bc77f9fab75"&gt;编辑&lt;/a&gt; &lt;a href="/UserInfo/Delete/e92cfb5c-e81a-4cfc-9d85-1bc77f9fab75" onclick="return confirm(&amp;#39;确认删除lili的记录?&amp;#39;);"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zhangsan&lt;/td&gt;
&lt;td&gt;女&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Resource&lt;/td&gt;
&lt;td&gt;&lt;a href="/UserInfo/Edit/e4b9c9f2-afd4-45f4-bb3d-1ca2c91642b3"&gt;编辑&lt;/a&gt; &lt;a href="/UserInfo/Delete/e4b9c9f2-afd4-45f4-bb3d-1ca2c91642b3" onclick="return confirm(&amp;#39;确认删除zhangsan的记录?&amp;#39;);"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hangwei&lt;/td&gt;
&lt;td&gt;男&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;&lt;a href="/UserInfo/Edit/3fdc971a-20c0-4016-b09b-703db265e972"&gt;编辑&lt;/a&gt; &lt;a href="/UserInfo/Delete/3fdc971a-20c0-4016-b09b-703db265e972" onclick="return confirm(&amp;#39;确认删除hangwei的记录?&amp;#39;);"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xiaoya&lt;/td&gt;
&lt;td&gt;女&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Human Resource&lt;/td&gt;
&lt;td&gt;&lt;a href="/UserInfo/Edit/64bb557a-0eae-4554-8258-99412f4a0c78"&gt;编辑&lt;/a&gt; &lt;a href="/UserInfo/Delete/64bb557a-0eae-4554-8258-99412f4a0c78" onclick="return confirm(&amp;#39;确认删除xiaoya的记录?&amp;#39;);"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lulu&lt;/td&gt;
&lt;td&gt;女&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;public relation&lt;/td&gt;
&lt;td&gt;&lt;a href="/UserInfo/Edit/d2da9745-8423-468d-b16c-a5f1e220228b"&gt;编辑&lt;/a&gt; &lt;a href="/UserInfo/Delete/d2da9745-8423-468d-b16c-a5f1e220228b" onclick="return confirm(&amp;#39;确认删除lulu的记录?&amp;#39;);"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;!-- Visual Studio Browser Link --&gt;
&lt;script type="application/json" id="__browserLink_initializationData"&gt;
{"appName":"InternetExplorer","requestId":"e66859a98d6d44589621dafbc30ed07b"}
&lt;/script&gt;
&lt;script type="text/javascript" src="http://localhost:38131/ed029686c8c448a4ad16768559cf6138/browserLink" async="async"&gt;&lt;/script&gt;
&lt;!-- End Browser Link --&gt;

&lt;/body&gt;
&lt;/html&gt;

总的来说,非常”干净”。跟Razor书写的代码几乎一样。再来看aspx页面生成的HTML:


&lt;!DOCTYPE html&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;&lt;title&gt;

&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;form method="post" action="WebForm1.aspx" id="form1"&gt;
&lt;div class="aspNetHidden"&gt;
&lt;input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /&gt;
&lt;input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /&gt;
&lt;input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="dGzszrXmAWyS03LAAgn9Mu1+oe52zJZWXOwK8eBrCoGaaS/NrVfZYEyrJvwBzrLQUvloUdjMnLIMY6ou+eUPBQzAbrXsu1pxuWUlqErhvIGpI/ZFKrtfWqhpA1Eh5Dwn8ITIgsK9q4FP+qZ7dHk7EdtIwrvR4JHcwaBwS1jc17WIRdeeMDIfC3/Bo4fED1739IKFjjnc6Wo+8LjZ/gvo/NY3Z6aKjdPrOd7Kaiali/xL8TvA6q51KDyb0xn+FIOs4gKtotrzhfrB6mjRlgSU9VRv/V8vghdES0qtH7zRBNgUK+APeUNrdWvbS/bdNbtOqmmyAAUhj+UxB98lP1Uq2/6GwNKdUhcqfPyB1tFVGKtASLQnSRyvhMHReAn6SlMFGbr/Iks8DG2ZGHpe9+9walyoEwkYSO3HwbJx8ZwYilUuAPnaXm9PhtrBmfKS+JWln9qPTz5Ene1+cfRMo/JrOv9PHE7geq5apg5XbqEONnHMRp5gf6foGSUozbmkjEPrqtVal8cmVMyLYFXmegRS0QNhyUxf9MW4O392d0FnpCqWomY6iX7f1Zufd8rfAA6/shzOd4tKmHr+aDnXjeEjVuPn4MAQj7F2SAKonTwn7MbHpStwqggpax6ouj9Rv1F2Apew7oe6RTcf4jD1PGneseg32CVZlgtDO/jU38wW8Ot56dqayPEq6WNXUPbyJ/jUbT4bKWcN7TllXjdBfIiqo5puP4ZFkK1Jeeeah7oScwU=" /&gt;
&lt;/div&gt;

&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]&gt;
&lt;/script&gt;


&lt;script src="/WebResource.axd?d=pynGkmcFUV13He1Qd6_TZPjjg_3PjzXOZ2RR84591qrPEBSFqiIUM7TmWtTTY9Q7RVnJXgsOCIupr1tET1vQvA2&amp;amp;t=635586541120000000" type="text/javascript"&gt;&lt;/script&gt;

&lt;a href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&amp;quot;ctl03&amp;quot;, &amp;quot;&amp;quot;, false, &amp;quot;&amp;quot;, &amp;quot;../add.aspx&amp;quot;, false, true))"&gt;新增&lt;/a&gt;
&lt;div style="height: 267px"&gt;
&lt;div&gt;
&lt;table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;"&gt;
&lt;tr&gt;
&lt;th scope="col"&gt;姓名&lt;/th&gt;&lt;th scope="col"&gt;性别&lt;/th&gt;&lt;th scope="col"&gt;年龄&lt;/th&gt;&lt;th scope="col"&gt;部门&lt;/th&gt;&lt;th scope="col"&gt;编辑&lt;/th&gt;&lt;th scope="col"&gt;删除&lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;lili&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;Human Resource&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Edit$0&amp;#39;)"&gt;编辑&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Delete$0&amp;#39;)"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;zhangsan&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;Resource&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Edit$1&amp;#39;)"&gt;编辑&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Delete$1&amp;#39;)"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;hangwei&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;Technology&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Edit$2&amp;#39;)"&gt;编辑&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Delete$2&amp;#39;)"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;xiaoya&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Human Resource&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Edit$3&amp;#39;)"&gt;编辑&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Delete$3&amp;#39;)"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;lulu&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;public relation&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Edit$4&amp;#39;)"&gt;编辑&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="javascript:__doPostBack(&amp;#39;GridView1&amp;#39;,&amp;#39;Delete$4&amp;#39;)"&gt;删除&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="aspNetHidden"&gt;

&lt;input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="B24E7CB3" /&gt;
&lt;input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE" value="cLskMNrn93I_KrBWtzNjrdnU4nEVf6xwwXS72kJcSzZSQTv9se1ft7fisMnkWVQ7Z1_Y9_pWYR72hqYsEfzaCrwR6i_KuWzhFn_wlzM3p741" /&gt;
&lt;input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="9sDy55QrEe0ZfiQhGKNvPEncESgVyis86+m/35or5jtV71SyrczxxZtNqnclLUIYCY9SxVMVhFTtH6/dC1a0JcJVCXr3M2w7+s4NlG+yZzYeecp4VCuGddyDMFStphryD6ncUMbxyJg5pLmFN56lo48qLRH9fBpud2tV4CyA4R1XsSIq6tmqduRgR43l/GP82S6BAn8w8pjMhqiw93soSt1S0Rt+QbNzDL/3mcJBpwn+yFK5gF0DuOly6Bb3OAv5HFp90N/rFDjogMMY+eHhOx97R/7BKXyqfyhKG3wg0H2ek4zQlKVhzC7KwX56hq1rD5SrQpg+u0qTdaxkZsOKuw==" /&gt;
&lt;/div&gt;&lt;/form&gt;

&lt;!-- Visual Studio Browser Link --&gt;
&lt;script type="application/json" id="__browserLink_initializationData"&gt;
{"appName":"InternetExplorer","requestId":"20a0a7414285497caad40f738f0947ce"}
&lt;/script&gt;
&lt;script type="text/javascript" src="http://localhost:38131/ed029686c8c448a4ad16768559cf6138/browserLink" async="async"&gt;&lt;/script&gt;
&lt;!-- End Browser Link --&gt;

&lt;/body&gt;
&lt;/html&gt;

&nbsp;

直观的,多了些”ViewState”。以上对比是不是就能说明MVC从性能和书写方面比WebForms好呢?

关于这点,首先注意Razor介绍里,Razor是一个独立的渲染引擎。至今为止没有专业的团队从性能的角度去测试它和WebForms的区别并给出实际结果的(估计结果相差不大)。其次,我个人比较赞同老赵的观点(为WebForms说几句话),高性能Web应用程序大多与具体所用的实现技术无关。MVC和WebForms各有各的好处和适合的应用场景,一味的压低WebForms抬高MVC,有种跟风和墙头草嫌疑。

Razor语法

1). @标示符

@符号表示Razor代码块的开始,无需像WebForms那样,加’%>’表示结束。Razor会自动从@符号的右边开始,判断哪些是后台代码,哪些是前台HTML。

 

2). 普通输出

如在.cshtml文件中,输入下面的代码:

@DateTime.Now;

前台会显示什么呢?如下图:

前台显示 时间+”;”(注意这个分号),在单语句@符号后,进行代码书写,是不需要加分号的,加分号会被当做HTML文本来输出到前台。

     如果进行代码和文本混合编写,可以这样:

时间 @DateTime.Now 星期: @DateTime.Now.DayOfWeek

文本和Razor代码,中间加空格,这样视图引擎就可以判定@后是代码部分。

关于文本和代码混合,还有一种简单的方式:

@("today is :" + DateTime.Now.Year + "year.")

使用@(),来进行多符号语句输出。

 

3). 在语句块中输出

语句块,使用@{}来表示一段代码。

复制代码
        @{
            @DateTime.Now.Month;
            <br />
            <label>块中变量输出:</label>
            int x = 8;
            @x;
        }
复制代码

在语句块中,需要注意的是:

a. 使用@符号进行输出,并且由于块中遵循C#代码机制,建议加分号(‘;’),这个分号不会输出到前台页面;

b. 直接使用HTML标签,会自动被识别为前台代码。这点真的很方便,想想在一个C#代码的编译环境,直接写HTML标签输出…;

c. 不能直接输出字符,如直接在代码块中书写”Test” ,Test 等,都是不被允许的,请谨记代码块中遵循的是C#(或VB)环境;

d. 其它书写方式同后台代码。

 

4). HTML辅助函数

以往的方式,我们是在代码中向前台输出HTML文本,这可以实现,但,不是很理想。像我本人,以前还使用了像jsrender这样的页面渲染方式。现在,借助于Razor的HTML辅助函数,可以轻松实现代码输出HTML。

使用@helper 语法,自定义辅助函数(代码片段可以放在任意位置)。

复制代码
    @helper pList(List<string> lst)
    {//HTML辅助函数
        <ul>
            @foreach (string p in lst)
            {
                <li>@p</li>
            }
        </ul>
    }
复制代码

然后使用

        HTML辅助函数:
        @{
            List<string> lsts = new List<string> { "a", "b", "c", "d", "e" };
            @pList(lsts);
        }

由于定义了名为pList的函数,使用时直接调用即可。

 

5). 其它

a)一些书写习惯,作用上是等价的,如条件判断、循环分支:

复制代码
        @if (1 == 1) { 
        }
        @foreach (string p in lsts){
        }
        @{
            if (1 == 1) { }
            foreach (string p in lsts) { }
        }
复制代码

b)代码注释,使用@*  …  *@

        @*
            代码注释符:
            http://www.cnblogs.com/hangwei
        *@

c)输出@符号,使用 @@

d)字符串转换

       字符串转换:
        @{
            string str = "10000";
            @str.AsInt();//在块中遵循后台代码形式
        }

 

6). 布局(模板)的使用

a)layout布局页的使用

首先你需要在MVC工程下的Views/Shared目录下,新建一个视图文件(此目录默认用来存放layout(模板)文件)。这里我们新建一个TestLayout.cshtml,代码如下:

复制代码
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <div>
    1.TestLayout是模板页 @DateTime.Now.ToString("HH:mm:ss.fff")
    </div>
    <div id="content"><!--内容页的内容会出现在此div中-->
        @RenderBody()
    </div>
</body>
</html>
复制代码

定义好布局页的内容 ,子页的部分,用@RenderBody()表示。再新建一个子页套用此布局页,代码如下:

复制代码
@{
    Layout = "~/Views/Shared/TestLayout.cshtml";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <div>
    2.Index页面 @DateTime.Now.ToString("HH:mm:ss.fff")
    </div>
</body>
</html>
复制代码

在页面的开始部分,使用Layout指定模板页的地址即可。我们再来看前台显示效果:

需要注意的是:MVC跟WebForms不同,子页是先于布局页被显示(渲染)出来的。

b)布局页的灵活使用(RenderSection)

有时我们需要页面的区域内容不是由布局页定,而是动态的,由子页自己决定内容的呈现。这时就使用到了RenderSection。比如我们在布局页TestLayout.cshtml加入以下代码:

    <div id="menu">
        <!--让子页决定如何呈现menu-->
        @RenderSection("menu", false) @*注意此方法跟MVC前版可能不同,false表示可选(非必须)*@
    </div>

再在子页中加入以下代码:

复制代码
    @section menu{
        <ul id="subMenu">
            <li>Item1</li>
            <li>Item2</li>
        </ul>
    }
复制代码

前台显示效果:

 

总结

本文主要对Razor的创立,Razor和WebForms视图引擎的对比做了简单介绍;同时详细介绍了Razor的语法。在下一章中,将介绍MVC5页面之间的传值,敬请期待~

希望本文对你有帮助。

作者:hangwei
出处:http://www.cnblogs.com/hangwei/
关于作者:专注于微软平台的项目开发、数据库调优等工作。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
如果您觉得文章对您有帮助,可以点击文章右下角“推荐”一下。您的鼓励是作者坚持原创和持续写作的最大动力!

卖货和运营网站是两码事儿

mikel阅读(1501)

卖货和运营网站是两码事,的确是两码事儿。

很多人卖货卖的很好,结果就想着天天这么刷朋友圈,咋地总有点儿小商贩儿的感觉,没有正规军的感觉,于是想着建个商城卖产品,这样才算正规军了!可是运营网站可不是卖货,明明是两码事儿,还不得不要结合到一起,就好像公司里面的网站运营部都归IT部管理,似乎所有网站运营的事都是那几个鼓捣程序的事儿跟销售没关系。

运营网站应该很多部门协调,卖货卖得好就是运营网站不见得能行,隔行如隔山吧。所以说网站的程序开始很容易就建起来,要是长久运营直到盈利那才是个持久战,运营网站的人总是拼着SEO排名,就好比战场上的指挥官指挥着人们抢夺搜索引擎那固定的首页排名,人们的心情也跟着排名忽上忽下,可更让人揪心的还是那订单量,没有订单就意味着没有卖出去货,怎么卖货的问题摆在每个运营的人的面前,这是硬指标,没有订单就没有盈利,貌似所有人的生计都绑在那个订单数量上了。

微商为什么那么火,而众多的B2C商城林立的互联网为什么这么多年都一直在挣扎在盈利和亏损的边缘,就像京东那些年一样,每个网站都在想着办法的摆脱亏损那洪水猛兽般涌来的底线,都在奋力的想往上爬,每天都在绷紧的要转化率和成交量,可人们的选择那么多何必来你网站买?于是一下子网站很尴尬,更何况还有微商在那疯狂的吸引着人们的眼球。

未来的电商会更加残酷,不再分微商和互联网电商了,世界变平了人们也变得更加习惯了。

帝国CMS的操作真难用

mikel阅读(1240)

帝国CMS的操作真难用,就是我现在的感觉,没有任何可操作性可言,后台乱七八糟,不用那么多cms达人来反驳我,我是个新的使用者,可是就是那么难用让我望而却步,包括模板和操作,总是云里雾里,就好比是一堆乱麻一样堆在那,然后帝国官方的人指着说:功能就在那,你自己用吧!

我勒个去!这是什么玩意儿!难怪很多人都在说帝国cms很强大,的确强大到普通的人不会用,尽管功能很多,可是就是那么乱,没人会用!更新个缓存,那么多按钮,然后是模板乱七八糟的标签那么抽象让人看得云里雾里不清楚是做什么的!

再说总体的布局和功能分类基本上就是开发人员自己安排的,难怪这么多年一直没什么起色,我想如果出现一个帝国cms助手之类的软件一下子肯定很火,因为真的没几个人有那么大的耐心去理那堆乱麻。

我是怀着烦乱和郁闷的心情在用着这个CMS系统!