1、 webapi允許跨域的增刪改查要在web.config中加入以下文字 2、webapi支持特性路由,即在action上可以加上類似 [Route("RoleRights/{id}")]的特性路由,前提條件是要支持特性路由,即在WebApiConfig.cs的register的方法中添加MapH ...
1、 webapi允許跨域的增刪改查要在web.config中加入以下文字
<system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> </customHeaders> </httpProtocol> </system.webServer>
2、webapi支持特性路由,即在action上可以加上類似 [Route("RoleRights/{id}")]的特性路由,前提條件是要支持特性路由,即在WebApiConfig.cs的register的方法中添加MapHttpAttributeRoutes().這樣訪問該action的時候就會無視路由表中的路由,訪問該路由的正確格式為:網站名稱/RoleRights/9.--9表示id。
3、ModelState.IsValid,該屬性可以判斷當客戶端傳送實體欄位格式不正確時會顯示為false.比如action中有參數實體A,A中b欄位是整形,你傳實體調用action,b你傳了個“”,此時該屬性值回味false.
4、註意添加webapi時生成的return BadRequest和return Notfound(),返回給web客戶端時是做為異常處理的,即調用失敗,如果使用jquery會調用error函數。返回的錯誤也比較明確.省去了自定義格式.
5、有時候我們只是對資料庫中的某條已有記錄做修改,那可以針對要修改的欄位設置如下:
db.FunctionInfoes.Attach(functionInfoNew);
db.Entry(functionInfoNew).Property(x => x.FunctionName).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.FunctionType).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.ParentId).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.FunctionPath).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.Description).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.LastUpdateBy).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.LastUpdate).IsModified = true;
try
{
db.SaveChanges();
}
其中ismodified=true表示做save的時候要修改此欄位.修改ismodufied之前一定要記得增加db.FunctionInfoes.Attach(functionInfoNew);否則會報錯.
6、註意db.FunctionInfoes.RemoveRange(childEntityInfo);和 db.FunctionInfoes.Where(item => item.OwnerId == id).Delete();
的區別,前者不會影響到資料庫記錄,除非增加db.SaveChanges(),後者的修改直接回影響到資料庫記錄而不需要做db.SaveChanges().
7、記得每個control要增加一個Options空方法,否則做刪除回提示not allowe this method。
public string Options()
{
return null; // HTTP 200 response with empty body
}
8、事務包裹是使用using(var dbContextTransaction = db.Database.BeginTransaction())
{....
....}
經查詢對於一個context的 db.SaveChanges(),其實已經放在一個事務裡邊了,具體的可以通過sql profile去跟蹤,對於分散式context的可能就要使用scope了.
9、使用entity framework table first的好處就是可對於資料庫欄位的更改,通過在edmx上右鍵Update model from database及時更新到程式model上.
對於實體序列化返回的屬性,可以使用工具Newtonsoft.Json,自定義返回的名稱。比如說實體A中有屬性
public string Title { get; set; },,但是渴望序列化後返回的屬性名是小寫的,那麼可以在該屬性上加上特性[JsonProperty("title")],即
[JsonProperty("title")]
public string Title { get; set; }