精通ASP.NET MVC ——URL和Ajax辅助器方法

Ajax(或者,如果你愿意,也可以称为AJAX)是 Asynchronous JavaScripts and XML(异步JavaScripts与XML)。其XML部分并不如它往常那样意义重大,但是异步部分却使AJax十分有用。这是后台请求服务器数据,而不必重载Web页面的一种模型。MVC框架包含了对渐进式Ajax内建的支持,这意味着你将使用辅助器方法来定义AJax特性,而不必在整个视图中添加代码。

准备示例项目 

新建一个空的MVC项目,然后新建一个People控制器,代码如下图所示:

public class PeopleController : Controller{private Person[] personData = {new Person { FristName = "Admin",LastName = "FreeMan",Role = Role.Admin},new Person { FristName = "Jacqui",LastName = "Griffyth",Role = Role.User},new Person { FristName = "John",LastName = "Smith",Role = Role.User},new Person { FristName = "Anne",LastName = "Jones",Role = Role.Guset}};// GET: Peoplepublic ActionResult Index(){return View();}public ActionResult GetPeople(){return View(personData);}[HttpPost]public ActionResult GetPeople(string selectedRole){if (selectedRole == null || selectedRole == "ALL"){return View(personData);}else{Role selected = (Role)Enum.Parse(typeof(Role), selectedRole);return View(personData.Where(p => p.Role == selected));}}}

在Views/Shared/_Layout.cshtml中添加CSS样式, 如下图所示:

@{Layout = null;
}<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width" /><title>_Layout</title><style typeof="text/css">label {display :inline-block;width:100px;}div.dataELem {margin: 5px;}h2 > label {width:inherit;}.editor-label, .editor_field {float:left;margin-top:10px;}.editor_field input {height:20px;}.editor-label {clear:left;}.editor_field {margin-left:10px;}.input[type=submit] {float:left;clear:both;margin-top:10px;}.column {float:left;margin:10px;}table, td, th {border:thin solid black;border-collapse:collapse;padding:5px;background-color:lemonchiffon; text-align:left;margin:10px 0;}div.load {color:red;margin:10px;font-weight:bold;}div.ajaxLink {margin-top :10px;margin-right:5px;float:left;}</style>
</head>
<body><div> </div>@RenderBody()
</body>
</html>

创建同步表单,/Views/People/GetPeople.cshtml,代码如下图所示:

@using WebApplication1.Models;
@model IEnumerable<Person>@{ViewBag.Title = "GetPeople";Layout = "/Views/Shared/_Layout.cshtml";
}<h2>Get People
</h2><table><thead><tr>First</tr><tr>Last</tr><tr>Role</tr></thead><tbody>@foreach (Person p in Model){<tr><td>@p.FristName</td><td>@p.LastName</td><td>@p.Role</td></tr>}</tbody>
</table>@using (Html.BeginForm())
{<div>@Html.DropDownList("selectedRole",new SelectList(new[] { "ALL"}.Concat(Enum.GetNames(typeof(Role)))))<button type="submit">submit</button></div>
}

 运行程序,并导航到/People/Getpeople/,如下图所示:

                 

选择下拉框中的角色类型,并点击submit按钮后,可以筛选出人员菜单,如下图所示:

                

                 

                 


创建基本的链接和URL 

视图的最基本任务之一是创建链接或URL,使用户能够随之进入应用程序的其他部分。以下是常见的可用的HTML辅助器:

渲染URLs的HTML辅助器
描述示例
相对于应用程序的URL

Url.Content(" / Content / Site.css")

output:

/Content/Site.css

链接到指定动作/控制器

Html.ActionLink("My Link","Index","Home")

output:

<a href = "/"> My Link </a>

动作URL

Url.Action("GetPeople","Peopole")

output:

/People/Getpeople

使用路由数据的URL

Url.RouteUrl(new {controller = "People",action = "GetPeople"})

output:

/People/Getpeople

使用路由数据的链接

Html.Route("My Link",new { controller = "People",action = "GerPeople"})

output:

<a href = "/People/GetPeople">My Link</a>

链接到指定的路由

Html.RouteLink("My Link","FormRoute",new { controller = "People", action = "GetPeople"})

output:

<a href = "/app/fomrs/People/GetPeople">My Link </a>

为Index控制器,添加了Index.html视图文件,代码如下图所示: 

@{ViewBag.Title = "Index";Layout = "/View/Shared/_Layout.cshtml";
}<h2>Basci Links</h2>
<table><thead><tr><th>Helper</th><tr>Output</tr></thead><tbody><tr><td>Url.Content("~/Content/Site.css")</td><td>@Url.Content("~/Content/Site.css")</td></tr>  <tr><td>Html.ActionLink("My Link","Index","Home")</td><td>@Html.ActionLink("My Link","Index","Home")</td></tr> <tr><td>Url.Action("GetPeople","People")</td><td>@Url.Action("GetPeople","People")</td></tr>    <tr><td>Url.RouteUrL(new {controller = "People",action = "GetPeople"})</td><td>@Url.RouteUrl(new { controller = "People",action = "GetPeople"})</td></tr><tr><td>Html.RouteLink("My Link",new { controller = "People",action = "GetPeople"})</td><td>@Html.RouteLink("My Link",new { controller  = "People",Action = "GetPeople"})</td></tr><tr><td>Html.RouteLink("My Link","FormRoute",new { controller = "People",action = "GetPeople"})</td><td>@Html.RouteLink("My Link","FormRoute", new { controller = "People",action = "GetPeople"})</td></tr></tbody>
</table>

并在RouteConfig的RegisterRoutes方法中,新增一条名叫FormRoute的路由,代码如下图所示:

routes.MapRoute("FormRoute","app/forms/{controller}/{action}/{id}",defaults:new { controller = "Home",action = "Index",id = UrlParameter.Optional})

运行程序,并导航到/home/index,如下图所示: 

 


使用AJax的条件

1、在Web.config文件中,UnobtrusiveJaveScriptsEnable的属性条目,必须为true,如下图所示:

                       

2、需要引入JS文件,一个是JQuery库文件,另一个是Ajax文件,如下图所示,在NugGet程序包中搜索下载即可:

       

在_Layout.cshtml中引入这两个JS文件: 

        


创建渐进式Ajax表单 

我们的目标是,在点击submit按钮时,只有HTML table元素中的数据被替换。首先重构People控制器中的方法,如下图所示:

public class PeopleController : Controller{private Person[] personData = {new Person { FristName = "Admin",LastName = "FreeMan",Role = Role.Admin},new Person { FristName = "Jacqui",LastName = "Griffyth",Role = Role.User},new Person { FristName = "John",LastName = "Smith",Role = Role.User},new Person { FristName = "Anne",LastName = "Jones",Role = Role.Guset}};// GET: Peoplepublic ActionResult Index(){return View();}//public ActionResult GetPeople()//{//    return View(personData);//}//[HttpPost]//public ActionResult GetPeople(string selectedRole)//{//    if (selectedRole == null || selectedRole == "ALL")//    {//        return View(personData);//    }//    else//    {//        Role selected = (Role)Enum.Parse(typeof(Role), selectedRole);//        return View(personData.Where(p => p.Role == selected));//    }//}public ActionResult GetPeople(string selectedRole = "All"){return View((object)selectedRole);}public PartialViewResult GetPeopleData(string selectedRole = "All"){IEnumerable<Person> data = personData;if (selectedRole != "All"){Role selected = (Role)Enum.Parse(typeof(Role), selectedRole);data = personData.Where(p => p.Role == selected);}return PartialView(data);}}

添加一个对GetPeopleData动作的分部视图,GetPeopleData.cshtml方法:

@using WebApplication1.Models
@model IEnumerable<Person>
@{Layout = null;
}@foreach (Person p in Model)
{<tr><td>@p.FristName</td><td>@p.LastName</td><td>@p.Role</td></tr>
}

更新GetPeople.cshtml代码,如下图所示: 

@using WebApplication1.Models
@model string@{ViewBag.Title = "GetPeople";Layout = "/Views/Shared/_Layout.cshtml";AjaxOptions ajaxOpts = new AjaxOptions { UpdateTargetId = "tableBody" };
}<h2>Get People
</h2><table><thead><tr>First</tr><tr>Last</tr><tr>Role</tr></thead><tbody id="tableBody">@Html.Action("GetPeopleData",new { selectedRole = Model})</tbody>
</table>@using (Ajax.BeginForm("GetPeopleData", ajaxOpts))
{<div>@Html.DropDownList("selectedRole",new SelectList(new[] { "ALL"}.Concat(Enum.GetNames(typeof(Role)))))<button type="submit">submit</button></div>
}

MVC框架支持AJax表达的核心在于Ajax.BeginForm 辅助器方法,它可以接受一个AjaxOptions对象作为其参数。可以在视图开始处,以Razor代码块的形式创建AjaxOptions对象,可以在调用Ajax.BeginForm时,内联的创建他们。 以下是AjaxOptions属性

AjaxOPtions属性
属性描述
Confirm在形成Ajax请求之前,设置显示给用户的确认窗口中的消息
HttpMethod设置用来形成请求的HTTP方法——必须是GET或POST
InsertionMode指定从服务器接受的内容以何种方式插入到HTML。三种选择被表示成 InsertionMode 枚举中的值 :InsertAfterInsertBefore、和Replace(默认值)
LoadingElementId指定HTML元素的ID,这是执行AJax请求期间要显示的HTML元素
LoadingElementIdDuration指定动画的持续时间,用于显露由LoadingElementId指定的元素
UpdateTarget设置HTML的ID,从服务器接受的内容将被插入到元素中
Url设置所请求服务器的Url

在上述示例中,将UpdateTargetId属性设置为tabledata ,当用户单击submit提交按钮时,会形成一个发送给GetPeopleData的动作方法的异步请求,所返回的HTML片段将用于替换tbody元素中的现有内容。运行结果如下图所示:


确保优雅降级 

使用Ajax的一个问题时,如果用户禁用JavaScripts(或者使用不支持JavaScript的浏览器时),当用户提交表达时,浏览器会放弃当前的HTML页面,并用目标动作方法返回的片段代替它(于是失去了页面的主题部分,特别是布局的效果,只剩下了所返回的数据)。如下图所示:

解决这一个问题的最简单的办法是使用AjaxOptions.Url属性,以便制定异步请求的目标URL作为Ajax.BeginForm方法的参数,而不是以动作名称作为参数,如下图所示:


在Ajax请求期间给用户提供反馈 

使用AJax的一个缺点是用户观察不到正在发生的事情,因为,发送给服务器的请求是在后台形成的。通过使用AJaxOptions.LoadingElementIdAjaxOptions.LoadingElementDuration属性,可以通知用户,此刻在执行一个请求。增阿基代码如下图所示:

LoadingElementDuration属性动画的持续时间,这是向用户显露loading元素的时间。这里的值是1000,即1秒, 运行效果如下图所示:


 请求之前对用户进行提示

AjaxOptions.Confirm属性可以用来指定一条消息,用来在每个异步请求之前对用户进行提示,代码如下图所示:

提示框如下图所示: 


创建Ajax链接 

除了表单之外,渐进式Ajax也可以用于创建异步执行的 a 元素。这一机制十分类似于Ajax表单的工作方式。如下图所示,在GetPeople.cshtml视图中添加AJax链接。

@using WebApplication1.Models
@model string@{ViewBag.Title = "GetPeople";Layout = "/Views/Shared/_Layout.cshtml";AjaxOptions ajaxOpts = new AjaxOptions{ UpdateTargetId = "tableBody",Url = Url.Action("GetPeopleData"),LoadingElementId = "loading",LoadingElementDuration = 1000,Confirm = "Do you wish to request new data"};
}<h2>Get People
</h2><div id="loading" class="load" style="display:none"><p>Loading Data......</p>
</div><table><thead><tr>First</tr><tr>Last</tr><tr>Role</tr></thead><tbody id="tableBody">@Html.Action("GetPeopleData",new { selectedRole = Model})</tbody>
</table>@using (Ajax.BeginForm(ajaxOpts))
{<div>@Html.DropDownList("selectedRole",new SelectList(new[] { "ALL"}.Concat(Enum.GetNames(typeof(Role)))))<button type="submit">submit</button></div>
}<div>@foreach (string role in Enum.GetNames(typeof(Role))){<div class="ajaxLink"></div>@Ajax.ActionLink(role,"GetPeopleData",new { selectedRole = role},new AjaxOptions { UpdateTargetId = "tableBody"})}
</div>

此例使用foreach循环,为Role枚举中定义的每一个值调用了Ajax.ActionLink辅助器,这创建了一组启用AJax的a元素,这里的a元素具有相同的属性标签,如下图所示:

运行效果如下图所示: 

点击链接,进行跳转,结果如下图所示: 


确保为链接优雅降级 

启用AJax的链接与启用Ajax的表单具有相同的问题。当浏览器没有启用JavaScript的支持时,单击这些链接只会生成GetPeopleData动作方法的生成的HTML片段。

为了解决这一问题,可以使用AjaxOptions.Url属性来指定AJax请求的URL,如下图所示:

<div>@foreach (string role in Enum.GetNames(typeof(Role))){<div class="ajaxLink"></div>@Ajax.ActionLink(role, "GetPeople",new { selectedRole = role }, new AjaxOptions { UpdateTargetId = "tableBody", Url = Url.Action("GetPeopleData", new { selectedRole = role })});}
</div>

使用AJax回调 

AjaxOption类定义了一组属性,能够在Ajax请求生命周期中的各个点上调用JavaScripts函数,如下图所示:

AjaxOptions回调函数
属性JQuery事件描述
OnBeginbeforeSend在发送请求之前立即调用
OnCompletecomplete请求成功时调用
OnFilureerror请求失败时调用
OnSuccesssuccess请求已经完成时调用,不管请求是否成功

修改GetPeople.cshtml的代码如下图所示: 

@using WebApplication1.Models
@model string@{ViewBag.Title = "GetPeople";Layout = "/Views/Shared/_Layout.cshtml";AjaxOptions ajaxOpts = new AjaxOptions{ UpdateTargetId = "tableBody",Url = Url.Action("GetPeopleData"),LoadingElementId = "loading",LoadingElementDuration = 1000,Confirm = "Do you wish to request new data"};
}<h2>Get People
</h2><div id="loading" class="load" style="display:none"><p>Loading Data......</p>
</div><table><thead><tr>First</tr><tr>Last</tr><tr>Role</tr></thead><tbody id="tableBody">@Html.Action("GetPeopleData",new { selectedRole = Model})</tbody>
</table>@using (Ajax.BeginForm(ajaxOpts))
{<div>@Html.DropDownList("selectedRole",new SelectList(new[] { "ALL"}.Concat(Enum.GetNames(typeof(Role)))))<button type="submit">submit</button></div>
}<div>@foreach (string role in Enum.GetNames(typeof(Role))){<div class="ajaxLink"></div>@Ajax.ActionLink(role, "GetPeople",new { selectedRole = role }, new AjaxOptions { UpdateTargetId = "tableBody", Url = Url.Action("GetPeopleData", new { selectedRole = role }),OnBegin = "OnBegin",OnFailure = "OnFailure",OnComplete = "OnComplete",OnSuccess = "OnSuccess" });}
</div><script type="text/javascript">function OnBegin() {alert("This is the On Begin Callback:")}function OnSuccess(data){alert("This is the OnSuccessCallback:" + data);}function OnFailure(request,error){alert("This is the On Failure Callback:" + error);}function OnComplete(request, status){alert("This is the OnComplete Callback:" + status);}
</script>

运行后,效果如下: 

                                  


 使用JSON

到目前为止的所有示例中,服务器都是渲染HTML片段,并把它们发送给浏览器,这是一种完全可接受的技术。但是有点亢长(因为服务器随数据一起发送了HTML元素),而且它限制了浏览器端用这些数据可做的事情。

解决这个问题的一种方式是使用JSON(JavaScrpt Object Notaiton——JavaScripts对象表示法)格式,这是一种与语言无关的数据表示方法。它源自于JavaScript语言,但一直采取自己的生存方式,并被广泛接受。

修改PeopleController中的代码,如下图所示:

    public class PeopleController : Controller{private Person[] personData = {new Person { FristName = "Admin",LastName = "FreeMan",Role = Role.Admin},new Person { FristName = "Jacqui",LastName = "Griffyth",Role = Role.User},new Person { FristName = "John",LastName = "Smith",Role = Role.User},new Person { FristName = "Anne",LastName = "Jones",Role = Role.Guset}};// GET: Peoplepublic ActionResult Index(){return View();}private IEnumerable<Person> GetData(string selectedRole){IEnumerable<Person> data = personData;if (selectedRole != "All"){Role selected = (Role)Enum.Parse(typeof(Role), selectedRole);data = personData.Where(p => p.Role == selected);}return data;}public JsonResult GetPeopleDataJason(string selectedRole = "All"){IEnumerable<Person> data = GetData(selectedRole);return Json(data, JsonRequestBehavior.AllowGet);}public PartialViewResult GetPeopleData(string selectedRole = "All"){return PartialView(GetData(selectedRole));}public ActionResult GetPeople(string selectedRole = "All"){return View((object)selectedRole);}}

上图中,新添加了一个动作方法,其名称为GetPeopleDataJson,它返回一个JsonResult对象,修改GetPeople.cshtml中的代码,如下图所示:

@using WebApplication1.Models
@model string@{ViewBag.Title = "GetPeople";Layout = "/Views/Shared/_Layout.cshtml";AjaxOptions ajaxOpts = new AjaxOptions{ UpdateTargetId = "tableBody",Url = Url.Action("GetPeopleData"),LoadingElementId = "loading",LoadingElementDuration = 1000,Confirm = "Do you wish to request new data"};
}<h2>Get People
</h2><div id="loading" class="load" style="display:none"><p>Loading Data......</p>
</div><table><thead><tr>First</tr><tr>Last</tr><tr>Role</tr></thead><tbody id="tableBody">@Html.Action("GetPeopleData",new { selectedRole = Model})</tbody>
</table>@using (Ajax.BeginForm(ajaxOpts))
{<div>@Html.DropDownList("selectedRole",new SelectList(new[] { "ALL"}.Concat(Enum.GetNames(typeof(Role)))))<button type="submit">submit</button></div>
}<div>@foreach (string role in Enum.GetNames(typeof(Role))){<div class="ajaxLink"></div>@Ajax.ActionLink(role, "GetPeopleData",new { selectedRole = role }, new AjaxOptions { UpdateTargetId = "tableBody", Url = Url.Action("GetPeopleDataJason", new { selectedRole = role }),OnSuccess = "processData" });}
</div><script type="text/javascript">function OnBegin() {alert("This is the On Begin Callback:")}function OnSuccess(data){alert("This is the OnSuccessCallback:" + data);}function OnFailure(request,error){alert("This is the On Failure Callback:" + error);}function OnComplete(request, status){alert("This is the OnComplete Callback:" + status);}function processData(data){var target = $("#tableBody");target.empty();for (var i = 0; i < data.length; i++){var person = data[i];target.append("<tr><td>" + person.FirstName + "</td><td>" + person.LastName + "</td><td>" + person.Role + "</td><td>")}}
</script>

注意:如果返回的数据是非私有的(private),才应该使用JsonRequestBehavior.AllowGet。由于许多web浏览器中的安全问题,第三方网站有可能截取响应GET请求返回的JSON数据,这是 JsonResult 默认不响应Get请求的原因。

运行程序,返回的JSON 字符串如下图所示:

[{"PersonId":0,"FristName":"Jacqui","LastName":"Griffyth","BirthDate":"\/Date(-62135596800000)\/","HomeAddress":null,"Role":1},{"PersonId":0,"FristName":"John","LastName":"Smith","BirthDate":"\/Date(-62135596800000)\/","HomeAddress":null,"Role":1}]

这看来有点乱,但是这种处理实际上是相当聪明的——虽然我们不需要包含所有字段。 首先,Person类所定义的全部属性都标识成了JSON,但是在Person控制器中对一些属性未赋值。在某些情况下,使用的是某个类型的默认值(例如,IsApproved用的是false值),但是对其他的属性使用了null(例如HomeAddress),有些值已经被转换成易于有JavaScript解释的形式,例如birthDate,而其他的一些则未处理——例如,Role属性使用了0,而不是Admin.

可以使用如下方式来检测结果:

可以用如下匿名类的方式来去掉不需要关注的字段:,修改控制器中的代码:

        public JsonResult GetPeopleDataJason(string selectedRole = "All"){var data = GetData(selectedRole).Select(p => new {First = p.FristName,LastName = p.LastName,Role = Enum.GetName(typeof(Role),p.Role)});return Json(data, JsonRequestBehavior.AllowGet);}

在动作方法中检测Ajax请求 

修改People控制器中 GetPeopleData 动作方法的代码,如下图所示:

 public ActionResult GetPeopleData(string selectedRole = "All"){IEnumerable<Person> data = personData;if (selectedRole != "All"){Role selected = (Role)Enum.Parse(typeof(Role), selectedRole);data = personData.Where(p => p.Role == selected);}if (Request.IsAjaxRequest()){var formattedData = data.Select(p => new{FirstName = p.FristName,LastName = p.LastName,Role = Enum.GetName(typeof(Role), p.Role)});return Json(formattedData, JsonRequestBehavior.AllowGet);}else{return PartialView(data);}}

以上代码中使用Request.IsAjaxRequest 方法对 Ajax请求进行检测,并且在其结果为true的情况下,交付JSON数据。 

修改GetPerson.cshtml中的代码如下图所示:

           

          

以上代码中, 将所有动作请求都采用了GetPeopleData动作方法,此方法会对是否采用AJax提交进行检测,从而返回指定的返回值:如果是AJax请求则返回Jason数据,否则返回部分视图。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精通ASP.NET MVC ——控制器可扩展性

MVC中引导动作方法执行过程的请求流程管道中&#xff0c;有两个重要的部件&#xff1a;控制器工厂(Controller Factory) 和 动作调用器&#xff08;Action Invoker&#xff09;。控制器工厂负责创建对请求进行服务的控制器实例&#xff0c;动作调用器负责查找并调用控制器类中的…

永中向香港博览会主办方演示云办公(转载)

4月16号“香港国际资讯博览会”主办方香港贸发局对永中云办公产品非常感兴趣&#xff0c;由永中员工演示&#xff0c;并拍摄了演示视频。转载于:https://blog.51cto.com/premium/837675

Backbone.js学习笔记

为什么80%的码农都做不了架构师&#xff1f;>>> http://documentcloud.github.com/backbone var todoItem new TodoItem(); todoItem.url /todo; todoItem.fetch(); todoItem.get(description)var TodoItem Backbone.Model.extend({urlRoot: /todos }); var tod…

ASP.NET MVC中使用Autofac实现简单依赖注入

本文参考资料&#xff1a; 1、https://www.cnblogs.com/RayWang/p/11128554.html。 2、https://www.cnblogs.com/eedc/p/6127181.html 3、https://www.cnblogs.com/ancupofcoffee/p/5007649.html#top 前言 关于IoC和DI(依赖注入)的概念网上一搜一大把。简单来说&#xff0c;Io…

初探EntityFramework——来自数据库的EF设计器

本文通过简单的示例&#xff0c;先初步了解下EF四种设计模式之一&#xff1a;来自数据库的EF设计器。 来自数据库的EF设计器&#xff0c;顾名思义&#xff0c;需要有新建的数据库和表结构&#xff0c;才能生成EF设计器&#xff0c; 在本地新建数据库KTStore&#xff0c;并且新建…

初探EntityFramework——空EF设计器模型

如果没有任何现存数据库架构&#xff0c;可以使用空的EF设计器模型。本文将通过简单示例&#xff0c;了解如何使用空EF设计器模型。 新建空的控制器应用程序EFDesignerDemo&#xff0c;如下图所示&#xff1a; 在项目中右键&#xff0c;选择“添加”&#xff0c;然后是“新建项…

初探EntityFramework——来自数据库的Code First

Entity Framkwork从第二版&#xff08;EF4&#xff09;开始&#xff0c;支持新的CodeFirst模式&#xff08;程序代码优先&#xff09;&#xff0c;以自定义类定义数据模型。简化了EF的开发过程。本文章使用简单的示例来说明如何使用来自数据库的CodeFirst模式。 新建一个空的控…

初探EntityFramework——空Code First模型

如果不是从现有的系统升级&#xff0c;想要创建全新的项目可以从“空Code First模型开始”。“空CodeFirst模型”要先创建类&#xff0c;Visual Studio会从项目第一次执行的时候根据连接自动创建需要的数据库结构。本文将简单示例说明如何使用“空CodeFirst模型”。 新建控制台…

初探EntityFramework——实体类结构映射

实体类与数据表的映射有一套专用的规则。Code First 采用的惯例优于预先设置的设计&#xff0c;在没有任何设置的情况下&#xff0c;自动检测模型结构并推导出默认设置以简化类的设计&#xff0c;因此不需要特别设置类的属性即可完成模型设计。 例如&#xff0c;当DbContext的模…

深入了解EntityFramework——数据注解属性

当惯例规则不符合设计需求时&#xff0c;我们可以使用数据注解配置打造更合适的数据库模型。本文根据示例项目对常用的数据注解属性做一个简要的举例说明。 EFCodeFirst使用的约定大于配置的的编程模式&#xff0c; 这种模式利用默认约定根据我们的领域模型建立概念模型。然我们…

Android上实现柱状图表

Android上实现柱状图算法实现 第一步&#xff1a; 获取Android设备的屏幕大小 第二步&#xff1a; 在View对象中使用Canvas绘制蓝色边框与白色背景XY轴两条线&#xff0c;代码如下 第三步&#xff1a; 绘制柱状图标题 第四步&#xff1a; 根据数据集计算出每个系列数据所占X轴的…

深入了解EntityFramework——Fluent API

Fluent API 除了惯例原则与属性数据注解外&#xff0c;FluentAPI是另一种支持实体类配置设置的方式。与属性数据注解相比&#xff0c;它提供了更广泛的功能与设置弹性。实体类若同时设置了数据注解&#xff0c;则采用的优先权是“Fluent API” > "数据注解" &g…

深入了解EntityFramework——Lazy Loading与Eager Loading

Lazy Loading&#xff1a;延迟加载。Eager Loading&#xff1a;贪婪加载。 首先通过一个简单的控制台应用程序例子说明延迟加载&#xff1a; 订单主表和订单从表&#xff0c;并且订单主表和订单从表是一对多的关系&#xff0c;代码如下图所示&#xff1a; //订单主表public cl…

SQL – 2.SQLServer的管理 + 3.SQL基础1 + 4.SQL基础2

SQLServer的管理 常用字段类型&#xff1a;bit(可选值0、1)、datetime、int、varchar、nvarchar&#xff08;可能含有中文用nvarchar&#xff09;varchar、nvarchar 和char(n)的区别&#xff1a; char(n)不足长度n的部分用空格填充。Var&#xff1a;Variable&#xff0c;可变的…

EntityFramework进阶——继承

通过类型继承&#xff0c;我们可以更弹性地处理数据&#xff0c;有3中相关的技巧&#xff0c;即TPH&#xff0c;TPT&#xff0c;TPC。 Table Per Hierarchy&#xff08;TPH&#xff09; 当单个数据表存储不同数据类型时&#xff0c;在数据模型的设计上&#xff0c;可以使用Tab…

EntityFramework进阶——数据编辑与维护

实体数据对象状态 在EF环境下&#xff0c;应用程序更改数据对象会引发数据集状态的变更&#xff0c;可能的状态有以下几种&#xff1a; 数据对象状态列表Added添加实体对象创建到实体集中&#xff0c;数据未添加进数据库Modified实体对象已经存在于实体数据集中&#xff0c;数…

第六章扩展——VMA

由 user process角度来说明的话&#xff0c;VMA 是 user process 里一段 virtual address space 区域&#xff1b;virtual address space 是连续的内存空间&#xff0c;当然VMA 也会是连续的空间。VMA 对 Linux 的主要好处是&#xff0c;可以内存的使用更有效率&#xff0c;並且…

EntityFramework进阶——数据变更冲突

TimeStamp 更新操作可能伴随数据冲突&#xff0c;我们可以通过并发处理妥善解决这一方面的问题。避免数据冲突比较方便的做法是自动加入字节数组&#xff08;byte[]&#xff09;类型的TimeStamp属性&#xff0c;对应到数据表中的rowvewsion类型字段&#xff0c;自动监控数据的…

MyBatis 数据持久层

引用&#xff1a;http://baike.baidu.com/view/4372646.htm MyBatis 的前身就是 iBatis 。是一个数据持久层(ORM)框架。 MyBatis框架 [1]iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Ac…

TP类库解析和使用系列[Input类]

2019独角兽企业重金招聘Python工程师标准>>> [ 概述 ] Input类是新版新增的一个输入数据管理类&#xff0c;提供了一些输入数据的管理和过滤。 [ 方法 ] getInstance 实例化Input类 filter 设置数据过滤方法 以下方法都是动态方法&#xff1a; get 获取get数据 post…