(六)Net Core項目使用Controller之一 c# log4net 不輸出日誌 .NET Standard庫引用致使的FileNotFoundException探究 獲取json串裏的某個屬

(六)Net Core項目使用Controller之一

 

1、簡介html


一、當前最流行的開發模式是先後端分離,Controller做爲後端的核心輸出,是開發人員使用最多的技術點。前端

二、我的所在的團隊已經選擇徹底拋棄傳統mvc模式,使用html + webapi模式。好處是前端徹底複用,後端想換語言,翻譯每一個api接口便可。git

三、我的最新的框架也是使用這種模式開發,後續會有文章對整個框架進行分析,詳見簽名信息。github

四、Controller開發時,有幾種不一樣的返回值模式,這裏介紹兩種經常使用的。我的使用的是模式二。web

 

2、Net Core 的 Controller返回值模式一ajax


一、模式一是在函數定義時直接返回類型,具體看代碼,以及運行效果。json

二、分別運行三個函數獲得效果。c#

這裏有個知識點,NetCore對象返回值默認首字母小寫。自行對比結果研究下。對象類型在js調用時,是區分大小寫的,這裏須要對應。後端

 

Controller模式一代碼api

複製代碼
 1     public class OneController : Controller
 2     {
 3         public string GetString(string id)
 4         {
 5             return "string:" + id;
 6         }
 7         public Model GetObject(string id)
 8         {
 9             return new Model() { ID = id, Name = Guid.NewGuid().ToString() };
10         }
11         public Dictionary<string, string> GetDictionary(string id)
12         {
13             Dictionary<string, string> result = new Dictionary<string, string>();
14             result.Add("ID", id);
15             result.Add("Name", Guid.NewGuid().ToString());
16             return result;
17         }        
18     }
19     public class Model
20     {
21         public string ID { get; set; }
22         public string Name { get; set; }
23     }
複製代碼

 

運行效果

 

 

 

 2、Net Core 的 Controller返回值模式二


 

一、模式二是在函數定義返回ActionResult類型,具體看代碼,以及運行效果。

二、分別運行三個函數獲得效果。

 

 Controller模式二代碼

複製代碼
 1    public class TowController : Controller
 2     {
 3         public ActionResult GetString(string id)
 4         {
 5             return Json("string:" + id);
 6         }
 7         public ActionResult GetObject(string id)
 8         {
 9             return Json(new Model() { ID = id, Name = Guid.NewGuid().ToString() });
10         }
11         public ActionResult GetObject2(string id)
12         {
13             //我的最經常使用的返回模式,動態匿名類型
14             return Json(new { ID = id, Name = Guid.NewGuid().ToString() });
15         }
16         public ActionResult GetContent(string id)
17         {
18             return Content("string:" + id);
19         }
20         public ActionResult GetFile(string id)
21         {
22             return File("bitdao.png", "image/jpeg");
23         }
24     }
複製代碼

 

運行效果

 

 

 

 

 

 

 

BitAdminCore框架做者。 框架演示:http://bit.bitdao.cn 框架使用:https://github.com/chenyinxin/cookiecutter-bitadmin-core 框架交流:QQ羣202426919
 
 
 

c# log4net 不輸出日誌

 

C# log4net 不輸出日誌( IsDebugEnabled、IsFatalEnabled、IsWarnEnabled、IsInfoEnabled、IsErrorEnabled的值爲 false)

若是確認你的log4net.config文件配置項都已經設置好,那麼運行你的項目以後查看你的項目bin目錄下的debug目錄[本地調試的狀況]下有沒有log4net.config這個文件。若是沒有的話,就把這個文件拷貝到debug目錄下,這樣調試的時候就能夠輸出日誌到你指定的目錄了。

還能夠設置log4net.config文件的屬性,如圖

 

 

 設置「複製到輸出目錄」屬性爲「始終複製」或者「若是較新則複製」,那麼你發佈項目的時候這個文件就會自動拷貝到發佈的目錄中去。

 

 

.NET Standard庫引用致使的FileNotFoundException探究

 

微軟近幾年推出.NET Standard,將.NET Framework,.NET Core,Xamarin等目標平臺的api進行標準化和統一化,極大地方便了類庫編寫人員的工做。簡單的說,類庫編寫人員在發佈庫的時候,只須要基於.NET Standard進行發佈,那麼編寫的程序能夠在各個目標平臺上都能到運行。

.NET Standard是一種標準,只要符合這個標準的平臺均可以運行基於此標準api構建的程序。

感受挺好用的,可是實際上用起來就有一些坑了。好比說這個常見的FileNotFoundException,當有這個狀況的時候,常常出現:

主程序的目標平臺是某個具體平臺(不是.NET Standard,好比說是.NET Framework 4.0),隨後爲了引入新的特性,升級了Framework爲4.6.1,它而且引用了一個.NET Standard類庫,剛好,這個類庫還引用了其餘的package。(即傳遞引用A->B->C的形式,其中A是.NET Framework程序,B是nuget包,C是B引用的nuget包。)在此狀況下,若是F5啓動程序,就會報FileNotFoundException。

測試條件
Visual Studio 2015 Community
測試用包:UnifiedConfig v1.1.6

提示未找到System.IO.FileSystem。乍看感受是一個簡單的引用錯誤,但unifiedconfig包裏面已經正常引用了這個項目,按道理vs可以正常幫咱們處理引用問題。到文件輸出路徑中查看,發現對應的包沒有正確複製過來。手動從package文件夾中複製過來,問題解決。

緣由出在這個跨平臺上。因爲存在引用傳遞,B不能肯定須要複製哪一個目標平臺的package到A的輸出路徑。當程序是從舊的Framework升級而來的時候,舊版的項目文件不能很好地處理.NET Standard的這個問題。但咱們手動一個一個複製也不是辦法,如下給出解決方案。

解決方案:

  1. 最直接的方案,修改主項目的.csproj文件,將<RestoreProjectStyle>PackageReference</RestoreProjectStyle>添加到第一個PropertyGroup
  2. 若是還不行,加上<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    或者
  • 在工具->nuget包管理器->程序包管理->默認包管理格式,從Packages.config改爲PackageReference。

後記

我記得在visual studio 2017早期版本還存在這個bug,升級以後visual studio 2017 15.6.4這個版本測試新建項目,已經沒有這個問題。而且默認生成的基於4.5.2以上Framework的.csproj文件已經添加<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>這個配置。可是當老版本的項目引用.NET Standard類庫的時候,仍是常常會出現這個問題,這時候,就須要咱們手動添加配置項目了。

 

 

 

獲取json串裏的某個屬性值

 

string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["beijing"]["zone"].ToString();
string zone_en = jo["beijing"]["zone_en"].ToString();

 

 

 

common.js

 

var Common = {
//獲得url參數(例:"http://localhost:1239?a=1")
GetQueryString: function (name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
//if (r != null) return unescape(r[2]); return null;
if (r != null) return decodeURI(r[2]); return null;
},
//回到頭部(參數爲距頂部的距離,默認沒有距離)
GoTop: function (marginTop) {
$('body,html').animate({ scrollTop: marginTop || 0 }, 500);
},
//回到尾部(參數爲距尾部的距離,默認沒有距離)
GoBottom: function (marginBottom) {
var sc = $(document).height() - (marginBottom || 0);
$('body,html').animate({ scrollTop: sc }, 500);
},
//獲得選擇器
ReturnObj: function (obj) {
try {
var object = typeof obj == "string" ? $("#" + obj).length ? $("#" + obj.replace("#", "")) : $("." + obj).length ? $("." + obj.replace(".", "")) : $(obj) : $(obj);
return object;
}
catch (e) {
return $(obj);
}
},
//切換驗證碼
ToggleCode: function (obj, codeurl) {
$(obj).children("img").eq(0).attr("src", codeurl + "?time=" + Math.random());
return false;
},
//四捨五入的函數
ForDight: function (Dight, How) {
//例:Common.ForDight(1.413, 1); 保留一位小數 結果爲1.4
Dight = Math.round(Dight * Math.pow(10, How)) / Math.pow(10, How);
return Dight;
},
//toFixed() 方法可把 Number 四捨五入爲指定小數位數的數字
//eg:var num = new Number(1);alert(num.toFixed(2)); 結果爲1.00
ForFixed: function (num, obj) {
var num = new Number(num);
return num.toFixed(obj);
},
ForNumber: function (number) {
return number / 100;
},

//顯示信息
MyMsg: {
//成功提示
SuccessMsg: function (msg, showTime, successFunction) {
Common.MyMsg.ShowMsg(msg, 1, showTime, successFunction);
},
//錯誤提示
ErrorMsg: function (msg, showTime) {
Common.MyMsg.ShowMsg(msg, 2, showTime);
},
//顯示信息(icon 1爲成功,2爲失敗,3爲詢問,4爲鎖,5爲哭臉,6爲笑臉,7爲警告)
//至關於一個重載的方法 參數icon不傳入的話,就是沒有任何符號的提示
//如:Common.MyMsg.ShowMsg("真的",3,2000, a); a爲方法名 參數必需要齊全,少一個調用方法都會失敗
ShowMsg: function (msg, icon, time, successFunction) {
try {
layer.msg(msg, {
icon: icon,
time: time || 2000 //2秒關閉
}, successFunction);//提示後能夠執行特定的function
} catch (e) {
alert(msg || e.message);
}
},
},
//加載層
MyLoad: {
//load下標
LoadIndexs: null,
//顯示加載
ShowLoad: function () {
Common.LoadIndexs = Common.LoadIndexs || new Array();
try {
Common.LoadIndexs[Common.LoadIndexs.length] = layer.load(2);
//Common.LoadIndexs[Common.LoadIndexs.length] = layer.open({
// type: 3,
// shade: [0.4, '#000']
//});
}
catch (e)
{ }
},
//關閉全部層
CloseLoad: function () {
if (Common.LoadIndexs) {
$.each(Common.LoadIndexs, function (index, ele) {
layer.close(ele);
});
}
}
},
//能夠是輸入後驗證的錯誤提示
//msg提示信息 obj是選中的對象 如:按鈕、文本框等
MyTips: function (obj, msg) {
layer.tips(msg, obj, {
tips: [1, '#3595CC'],
time: 2000
});
},
//詢問框
MyConForm: function (msg, successFunction) {
try {
layer.confirm(msg, { icon: 3, title: "提示" }, function (index) {
successFunction();
layer.close(index);
});
}
catch (e) {
if (confirm(msg)) {
successFunction();
}
}
},
MyAjax: {
//發起ajax請求
Ajax: function (type, url, data, async, dataType, successFunction, isShowLoad) {
//彈出遮罩
//$(document).ajaxStart(function () {
// Common.MyLoad.ShowLoad();
//});
//關閉遮罩
$(document).ajaxStop(function () {
Common.MyLoad.CloseLoad();
});
//發起請求
$.ajax({
type: type,
url: url,
data: data, //$.extend(data, { M: Math.random() }),
global: isShowLoad,
async: async,//true 異步 默認值,false 同步
contentType: dataType,//dataType
success: successFunction,
error: Common.MyAjax.AjaxError
});
},
//發起ajaxPost請求,返回json
GetJsonByPost: function (url, data, async, successFunction, isShowLoad) {
Common.MyAjax.Ajax("POST", url, data, async, "application/json", successFunction, isShowLoad);
},
//發起ajaxGet請求,返回json
GetJsonByGet: function (url, data, async, successFunction, isShowLoad) {
Common.MyAjax.Ajax("GET", url, data, async, "application/json", successFunction, isShowLoad);
},
//發起ajaxPost請求,返回html
GetHtmlByPost: function (url, data, async, successFunction, isShowLoad) {
Common.MyAjax.Ajax("POST", url, data, async, "html", successFunction, isShowLoad);
},
//發起ajaxGet請求,返回html
GetHtmlByGet: function (url, data, async, successFunction, isShowLoad) {
Common.MyAjax.Ajax("GET", url, data, async, "html", successFunction, isShowLoad);
},
//ajax錯誤時調用
AjaxError: function (XMLHttpRequest, textStatus, errorThrown) {
//dialog({ title: '提示', content: "狀態:" + textStatus + ";出錯提示:" + errorThrown, okValue: '肯定', ok: function () { } }).showModal();
}
},
//操做cookies
MyCookie: {
//寫cookies(過時時間默認爲7天)
SetCookie: function (name, value, expiresDays) {
var exp = new Date();
expiresDays = expiresDays || 7;
exp.setTime(exp.getTime() + expiresDays * 24 * 60 * 60 * 1000);//";//
document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString() + ";path=/;";//domain=" + Common.DomainName.MaxName();//domain=testcubejoy.com
},
//讀取cookies 
GetCookie: function (name) {
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg)) {
return decodeURI(unescape(arr[2]));
//return unescape(arr[2]);
}
else
return null;
},
//刪除cookies 
DelCookie: function (name) {
var exp = new Date();
exp.setTime(exp.getTime() - 8 * 24 * 60 * 60 * 1000);
var cval = Common.MyCookie.GetCookie(name);//";//
if (cval != null)
document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString() + "; path=/;";//domain=" + Common.DomainName.MaxName();//domain=testcubejoy.com
//$.cookie("idphonemail", null);
},
DelDomainCookies: function (domain) {
var cookies = document.cookie.split(/; */);
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i];
if (cookie.indexOf(domain) != -1) {
var eqPos = cookie.indexOf("=");
var name = cookie.substr(0, eqPos);
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=" + domain;
}
}
}
},
MyVerification: {
//驗證數字
VerificationInt: function (value) {
var patrn = /^[0-9]{1,20}$/;
if (typeof value == "number") {
return true;
}
else if (typeof value == "string" && !patrn.test(value)) {
Common.MyMsg.ErrorMsg("請輸入正確的數字");
return false;
}
},
//驗證手機(參數1爲值,參數2爲是否顯示默認提示)
VerificationMobile: function (value, isShowMsg) {
var patrn = /^(13[0-9]|15[0|3|6|7|8|9]|18[0-9])\d{8}$/;
if (patrn.test(value)) {
return true;
}
else {
if (isShowMsg) {
Common.MyMsg.ErrorMsg("請輸入有效的手機號");
}
return false;
}
},
},

}

 

 

如何調用common.js

 

第一步

頁面須要引用此js

第二步

var loginJs = {
//登陸
goLogin: function () {
var _userinfo = { name: "夏小沫", pwd: "123" };
var _addinfo = { Country: "北京", Street: "上地三街" };
Common.MyAjax.GetJsonByPost("/myinfo/GetInfo", JSON.stringify({ userinfo: _userinfo, addinfo: _addinfo }), false, function (data) {
try {
alert(data);
} catch (e) {
alert(e.message);
}
});
},
}

這是調用common.js的方法,方法很簡單,common.js就至關於一個類,直接調取就能夠。

備註:

loginJs是一個新的Js,寫法可能和你的寫法不太同樣,不過沒有關係,換個寫法也是能夠的

function aa(){

Common.MyAjax.GetJsonByPost("/myinfo/GetInfo",JSON.stringify({userinfo: _userinfo, addinfo: _addinfo}),false,function(data){

alert(data);

})

}

 

 

 

js 篩選數據

 

<input type="text" id="filterName">

<div class="scope fr">
<div class="option">
<div>所有積分範圍</div>
<div>0-100積分</div>
<div>100-500積分</div>
<div>1000-5000積分</div>
<div>5000-10000積分</div>
<div>10000積分以上</div>
</div>
</div>

$(function(){

$("#filterName").keyup(function(){

$(".option div").hide().filter(":contains('"+($(this).val())+"')").show();

}).keyup();

$(".option div").click(function(){

var _txt=$(this).text();

$("#filterName").val(_txt);

})

})

 
 
 

Join 具體用法

 

一.Join 語法概念

Join 按照功能可分爲三大類:

left join (左鏈接) 即:取左邊表的所有數據,即便右邊表沒有對應的數據,也是會把左邊表的數據取出來,並返回

right join(右鏈接) 即:和left join 相反,取右邊表的所有數據。

inner join(內鏈接,也叫等值鏈接) 即:取兩個表中共同的數據,相似於數學中的交集。

二.Left Join

語句:select * from TableA left join TableB on TableA.orderid=TableB.orderid

結果說明:取TableA表中全部的記錄與匹配TableB表中的記錄,若是TableB中沒有匹配的數據,則返回null,返回的數據集個數是TableA表中的個數

返回的結果集如圖:

三.Inner Join

語句:select * from A  inner join B on A.orderid=B.orderid

結果說明:inner join產生同時符合A和B的一組數據

返回結果集如圖:

四.Right Join

語句:select * from A right join B on A.orderid=B.orderid

結果說明:取TableB表中全部的記錄與匹配TableA表中的記錄,若是TableA中沒有匹配的數據,則返回null,返回的數據集個數是TableB表中的個數

返回結果如圖:嘻嘻,沒有現成的圖,就不整圖片啦,相信你會了解返回的數據集的

相關文章
相關標籤/搜索