当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪爱上MVC3~Razor引擎时,在遍历中巧用Output.Write方法      在Razor引擎中,对于在表格中进行遍历时,一般会这样写<table border="1"> @{ for (var i = 0; i < 10; i++) { <tr> <td> @i </td> </tr>.........
    ▪ASP.NET MVC 上传文件方法      前端:<form id="form" method="post" action="/Attachment/Save/index.html" enctype="multipart/form-data" > <table> <tr> <td> 上传文件: </td> <td> &.........
    ▪Entity Framework 并发处理      什么是并发?并发分悲观并发和乐观并发。悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档锁住,B就没办法打开了,只有等A修改完,完全退.........

[1]爱上MVC3~Razor引擎时,在遍历中巧用Output.Write方法
    来源:    发布时间: 2013-10-28

在Razor引擎中,对于在表格中进行遍历时,一般会这样写

<table border="1">
@{
for (var i = 0; i < 10; i++)
{
<tr>
<td>
@i
</td>
</tr>
}
}
</table>

这是没有问题的,但如果你的元素i,希望在一行显示2列,你应该如何去做,下面的代码是不被razor接受的

<table border="1">
@{
for (var i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
<tr>
}
<td>
@i
</td>
if(i%2!=0){
</tr>
}
}
}
</table>

这种写法在运行时会抛出异常的,因为razor特有的对标记的智能识别,省去了<%%>这种结尾标记,所以上面的写法对于razor是不能接受的,我

们需要把代码修改一下,把<tr>标记写在程序里,代码如下:

<table border="1">
@{
for (var i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
Output.Write("<tr>");
}
<td>
@i
</td>
if (i % 2 != 0)
{
Output.Write("</tr>");
}
}
}
</table>

注意,我们在输出时没有用Write,也没有用Response.Write,因为这两种输出都不能在原位置进行输出,而如果希望在原位置输出指定字符,需要

使用Output对象的Write方法,结果如下:

感谢阅读!

本文链接


    
[2]ASP.NET MVC 上传文件方法
    来源:    发布时间: 2013-10-28
前端:

<form id="form" method="post" action="/Attachment/Save/index.html" enctype="multipart/form-data" >

<table>

<tr>
<td>
上传文件:
</td>
<td>

<input id="FileNamePath" required="true" name="FileNamePath" type="file" />(注:选择图片文件)
</td>
</tr>


</table>
</form>

这里要特别注意:enctype="multipart/form-data",否则后台无法获取到

后端:
string fileExtension = string.Empty; ;
string filename = string.Empty; ;
string filePathName = string.Empty;
long fileSize = 0;
if (Request.Files["FileNamePath"].ContentLength>0)
{
string path = Server.MapPath(ConfigHelp.GetAppSettings("ADImage"));
string uploadFileName = Path.GetFileName(Request.Files["FileNamePath"].FileName);

fileExtension = System.IO.Path.GetExtension(Request.Files["FileNamePath"].FileName).ToLower();
filename = entity.Title + fileExtension;
filePathName = Path.Combine(path, filename);
Request.Files["FileNamePath"].SaveAs(filePathName);
fileSize = Request.Files["FileNamePath"].ContentLength;

}

 多个文件时后台的获取方式为:

      foreach(string name in Request.Files)
       {
         Request.Files["name"]
     }

这里的name是前台标签input的name

本文链接


    
[3]Entity Framework 并发处理
    来源:    发布时间: 2013-10-28

什么是并发?

并发分悲观并发和乐观并发。

悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档锁住,B就没办法打开了,只有等A修改完,完全退出的时候B才能进入修改。

乐观并发:同上面的例子,A,B两个用户同时登录,如果A先进入修改紧跟着B也进入了。A修改文档的同时B也在修改。如果在A保存之后B再保存他的修改,此时系统检测到数据库中文档记录与B刚进入时不一致,B保存时会抛出异常,修改失败。

EF中如何控制并发?

Entity Framework不支持悲观并发,只支持乐观并发。

如果要对某一个表做并发处理,就在该表中加一条Timestamp类型的字段。注意,一张表中只能有一个Timestamp的字段。

Data Annotations中用Timestamp来标识设置并发控制字段,标识为Timestamp的字段必需为byte[]类型。

public class Person
{
public int PersonId { get; set; }
public int SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}

Fluent API用IsRowVersion方法

modelBuilder.Entity<Person>().Property(p => p.RowVersion).IsRowVersion();

我们看到生成的数据库中,RowVersion是timestamp类型。

下面我们写一段代码来测试一下:

static void Main(string[] args)
{
var person = new Person
{
FirstName = "Rowan",
LastName = "Miller",
SocialSecurityNumber = 12345678
};
//新增一条记录,保存到数据库中
using (var con = new BreakAwayContext())
{
con.People.Add(person);
con.SaveChanges();
}

var firContext = new BreakAwayContext();
//取第一条记录,并修改一个字段:这里是修改了FirstName
//先不保存
var p1 = firContext.People.FirstOrDefault();
p1.FirstName = "Steven";

//再创建一个Context,同样取第一条记录,修改LastName字段并保存
using (var secContext = new BreakAwayContext())
{
var p2 = secContext.People.FirstOrDefault();
p2.LastName = "Francis";
secContext.SaveChanges();
}
try
{
firContext.SaveChanges();
Console.WriteLine(" 保存成功");
}
catch (DbUpdateConcurrencyException ex)
{
Console.WriteLine(ex.Entries.First().Entity.GetType().Name + " 保存失败");
}
Console.Read();
}

上面我们实例化了三个DbContext,第一个增加一条记录到数据库中,第二个修改刚增加的记录但不保存,然后第三个Context也取刚新增的记录并保存,最后再保存第二个Context,结果保存失败。

可以看到我们的并发控制取到了作用。

分析EF生成的SQL语句:

exec sp_executesql N'update [dbo].[People]
set [LastName] = @0
where (([PersonId] = @1) and ([RowVersion] = @2))
select [RowVersion]
from [dbo].[People]
where @@ROWCOUNT > 0 and [PersonId] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8)',@0=N'Francis',@1=1,@2=0x00000000000007D1

可以看到,它在取对应记录的时候把RowVersion也作为筛选条件。上面例子中的secContext保存的时候,数据库中的RowVersion字段的值就变了,所以firContext保存的时候用原来的RowVersion取值,自然就取不到相应的记录而报错。

如果我们只是要对某个字段作并发控制呢?别着急,EF也有办法。

Data Annotations中用ConcurrencyCheck来标识

public class Person
{
public int PersonId { get; set; }
[ConcurrencyCheck]
public int SocialSecurityNumber { get; set; }
p
    
最新技术文章:
▪C#通过IComparable实现ListT.sort()排序
▪C#实现对Json字符串处理实例
▪Winform实现抓取web页面内容的方法
▪Winform实现将网页生成图片的方法
▪C#控制台程序中处理2个关闭事件的代码实例
▪WinForm实现同时让两个窗体有激活效果的特效...
▪WinForm实现拦截窗体上各个部位的点击特效实...
▪用C#的params关键字实现方法形参个数可变示例
▪C#判断某程序是否运行的方法
▪C#验证码识别基础方法实例分析
▪C#通过WIN32 API实现嵌入程序窗体
▪C#实现获取鼠标句柄的方法
▪C#事件处理和委托event delegate实例简述
▪C#获取程序文件相关信息的方法
▪C#中的除法运算符与VB.NET中的除法运算符
▪ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedLi...
▪Base64编码解码原理及C#编程实例
▪C#实现的优酷真实视频地址解析功能(2014新算...
▪C#和SQL实现的字符串相似度计算代码分享
▪C#使用Word中的内置对话框实例
▪C#反射之基础应用实例总结
▪C#生成单页静态页简单实例
▪C#实现SMTP邮件发送程序实例
▪C#实现随鼠标移动窗体实例
▪C#使用GDI+创建缩略图实例
▪C#实现通过模板自动创建Word文档的方法
▪C#中Response.Write常见问题汇总
▪C#中多态、重载、重写区别分析
▪WinFrom中label背景透明的实现方法
▪C#中out保留字用法实例分析
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3