關於轉向的問題,目前知道的是Response.Redirect 和 location.href javascript
我如今有兩個controller,Home和Testcss
<h2>this is Home</h2> <p id="test">你們好,我是Vae</p> <button type="button" onclick="on()">點我</button> <script> function on() { alert("我轉向了啊"); @{ Response.Redirect("/Test/Index"); } } </script>
Response.Redirect 這種方法呢,會直接的就轉向了,那個alert沒什麼反應,並且貌似只能重定向到那個頁面,不能返回HomeController?html
這裏我不明白的是沒有通過個人button點擊事件就執行了JavaScript代碼前端
第二種方式比較好java
<h2>this is Home</h2> <p id="test">你們好,我是Vae</p> <button type="button" onclick="on()">點我</button> <script> function on() { alert("我轉向了啊"); location.href="/Test/Index"; } </script>
這個仍是很不錯的,暫且寫到這裏jquery
其實.Net MVC只是做爲後臺,前端的頁面目前來講,主要是用的Easy UI或者Bootstrap這兩個。這兩個前端框架,得花時間學一學基本的語法,還有就是控件怎麼接受數據,這一點明白了就會了,剛好我什麼都不懂啊,前端徹底不會。看我幾時能學會吧......ajax
Easy UI有一個表格控件DataGrid,我只知道它經過json來傳輸數據,目前我已知的方法有兩種:sql
1.經過方法數據庫
2.經過urljson
第二種應該是最經常使用的,可是我還不會,來試試第一種。方法有三種,load,reload,loaddata。loaddata能夠成功,前兩種不行,目前不知道爲啥
<link rel="stylesheet" type="text/css" href="http://www.w3cschool.cc/try/jeasyui/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="http://www.w3cschool.cc/try/jeasyui/themes/icon.css"> <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script> <script type="text/javascript" src="http://www.w3cschool.cc/try/jeasyui/jquery.easyui.min.js"></script> <div> <table id="dg" class="easyui-datagrid" style="width:300px;height:250px" title="測試" iconCls="icon-save"> <thead> <tr> <th field="name" width="80">Item ID</th> <th field="pass" width="80">Product ID</th> </tr> </thead> </table> </div> <script type="text/javascript"> $(function () { var json='{"total":1,"rows":[{"name":"jim","pass":3}]}'; var aa=$.parseJSON(json); $("#dg").datagrid("loadData",aa); }); </script>
EasyUI控件怎麼綁定數據這件事,我以及會了,忽然有一種感受,這些前端框架我以及能夠自由運用了
拿最經典的DataGrid來舉個例子,在.Net NVC裏面最經常使用的綁定數據的方式是這樣的:
function Test() { $('#tbVehicleList').datagrid({ url: '/MileageAnalysis/FindMileage', columns: [ [ { field: 'ck', checkbox: true }, //複選框 { title: '姓名', field: 'name', width: 150, sortable: false }, { title: '年齡', field: 'age', width: 0 } ] ],
success: function (data) {
if (data.Success) {
showTips("刪除選定的記錄成功");
$("#tbVehicleList").datagrid("reload");
//當刪除完成以後,第二次刪除的時候還記得上次的信息,這樣是不能夠的,因此咱們須要清除第一次的信息
// rows.length = ""; //第一種方法
$("#tbVehicleList").datagrid("clearSelections"); //第二種方法
} else {
showError("操做失敗:" + data.ErrorMessage, 1000);
}
}
})
}
就是一個url指向一個Controller裏面的某個ActionResult。而後在column裏面寫出你想展現的列。
那個ActionResult會返回一個json格式的字符串,EasyUI會本身去加載的,返回的json格式是這樣的:
"{\"total\":1,\"rows\":[{\"name\":\"蜀雲泉\",\"age\":18}}"
由於""雙引號須要轉義,因此加 \
這裏須要提醒一下,json格式必須是這樣的,必須加total,有rows,不然是加載不出來數據的。還有,rows裏面的key名,要和你的DataGrid裏指定的列名一致。
public ActionResult FindMileage() { string s; HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://yingyan.baidu.com/api/v3/track/getdistance?ak=Cc2jtfLRovsm7fB7yYmLGRWcN6pKA1Et&service_id=147202&entity_name=668304050243483&start_time=1519784148&end_time=1519870548"); req.Method = "GET"; WebResponse wr = req.GetResponse(); Stream ResStream = wr.GetResponseStream(); Encoding encoding = Encoding.GetEncoding("UTF-8"); StreamReader streamReader = new StreamReader(ResStream, encoding); s=streamReader.ReadToEnd(); JSONObject obj = new JSONObject(s); string dis = obj.GetString("distance"); string test ="{\"total\":1,\"rows\":[{\"VehicleID\":\"粵B8C97M\",\"Mileage\":33271.613108398}]}"; return Content(test); }
上次講到了怎麼經過url來獲取json,如今來說講怎麼傳參數過去
1.先說說控件的事,控件有時間控件,輸入框控件,下拉框控件等等,獲取值的方法是不同的,以下:
下拉框:$("#id").combobox('getValue') 時間框:$("#id").datebox('getValue') 文本輸入框:$("#id").val() 樹形框:combotree('getValue') 數字輸入框:numberbox('getValue')
//h3這種標籤的取值賦值
$('#h3').val()
$('#h3').text = '修改詢價';
//輸入框這種的取值賦值
$('#Company').val()
$('#Company').val(CompanyName)
2.來說講傳參的事,目前我所知的有兩種
第一種:在url裏面直接寫上參數,這種方式是在Router路由裏面寫的,能夠用。可是我不喜歡這種方式
url: '/Controller/Action/?Params1=a&Params2=b',
第二種:異步傳參
<script type="text/javascript"> $(function () { BindSearchEvent(); }); function BindSearchEvent() { $("#btnSearch").click(function () { var queryData = { _ZB_VehicleID: $("#StartTime").datebox('getValue'), _ZB_Remark: $("#EndTime").datebox('getValue') } InitVehicleList(queryData); return false; }); } function InitVehicleList(queryData) { $('#tbVehicleList').datagrid({ url: '/MileageAnalysis/FindMileage', queryParams: queryData, //異步查詢的參數 columns: [ [ { field: 'ck', checkbox: true }, //選擇 { title: '車輛名稱', field: 'VehicleID', width: 150, sortable: false }, { title: '里程數', field: 'Mileage', width: 0 } ] ] })} </script>
寫了一個最簡單的例子,初始化函數裏面調用了
BindSearchEvent()
而後這個方法裏面定義了queryData這個異步的參數,直接傳給
InitVehicleList()
而後寫個下面的就完事了
queryParams: queryData, //異步查詢的參數
那麼,個人MVC後天怎麼調用呢?
public ActionResult FindMileage() { string StartTime = Request["_ZB_VehicleID"]; string EndTime = Request["_ZB_Remark"]; }
就是這樣。我以爲,我又牛逼了一點點........
我終於學會了Bootstrap表格加載json數據的方法,啊哈哈哈哈!!!,網上的文章大部分根本沒有講解清除,天下文章一大抄。。。。
我歷經了好多磨難,纔會了bootstrap-table的使用,推薦看個人這篇博客。。。
我經歷了惱人的痛苦,爲了體驗C#的新特性,我把.Net 框架升級到了4.5,結果降版本的時候降不回去了,可是發佈的時候,服務器又是4.0的框架,老舊的windows server 2008 r2 不支持4.5版本框架,必須安裝一個sp1補丁包才能夠....麻煩的要死,教訓是,之後最好不要升級框架版本,發佈的時候遇到了一個問題,詳情見 個人文章
今天學習一下ajax的用法,ajax主要是來異步傳參數的,切記,ajax不能訪問具備下載功能的方法,說多了都是淚啊。。。
ajax用法:
var queryData = {
CourseId: ids
}
$.ajax({
type:'post',
url: '/SelectCourse/InsertCourse',
data: queryData,
traditional: true
});
參數必定要寫成上面的queryData那樣的格式!
若是你傳的參數是字符串,那麼
traditional:true
可寫,可不寫,可是若是你傳的參數是數組,那麼必須寫了。
後臺仍是這樣:
public ActionResult InsertCourse() { var data = Request["CourseId"]; }
完美😁
登陸頁面,登陸以後我想記住當前登陸的帳號,已知的方法有兩個
1.session
2.cookies
session是在服務器端的記錄,若是用戶量很大的話服務器是不堪重負的,而cookies是客戶端的保存用戶記錄,用戶量大也不要緊。因此這裏採用了cookies的方法
前端頁面:
前端的代碼:
<script> function Login() { var queryData = { id : $('#xuehao').val(), password : $('#password').val() } $.ajax( { type: 'post', url: "/Home/Login", data: queryData, success: function (data) { if (data == "yes") { location.href ="/MyCourse/Index"; } else { alert("登陸失敗!請檢查學號及密碼"); } } } ) } </script>
這就是一個ajax而已,而後咱們看看咱們的後端代碼:
public ActionResult Login() { string name = Request["id"]; string psword = Request["password"]; HttpCookie cook = new HttpCookie("name",name); Response.Cookies.Add(cook); SqlHelper sqlHelper = new SqlHelper(); string num= sqlHelper.SqlQuery(name,psword); return Content(num); }
這裏咱們用到了HttpCookie 還給它起了個name的名字,而後在要使用的地方如此調用便可:
@if (@Request.Cookies["name"] != null) { @Request.Cookies["name"].Value }
若是是在頁面裏面加個<p>等標籤就好了
權限不一樣的人看到的東西也不一樣,例如按鈕有的人就看不到,個人思路是根據用戶類型隱藏按鈕,代碼以下:
if(是蜀雲泉){ $("#plshbtn").attr("style","display:block;"); //顯示 } if(是許嵩){ $("#plshbtn").attr("style","display:none;"); //隱藏 }
補充:這個地方實際上是不對的,正確的思路應該是在前端頁面加判斷。而後根據判斷去append html標籤。而不是顯示隱藏,例如:
if(是蜀雲泉){ $("#spType").append("<label><input></input></label>"); }
這個思路實際上是比較好的方法,是這個就加html元素。不是的話就不用寫東西了。
我 學會了行內編輯,參考個人 這篇文章
再有一週就要畢業答辯了,個人畢業設計僅僅只有連個頁面,這麼簡陋我都懷疑我過不了答辯。。。
因此加了幾個功能,其中一個是使用百度的ECharts圖表來展現一些數據,可是在ECharts圖表接受後臺的數據的時候不會弄了,我百度了一下,發現大部分人用的都不是MVC技術,
並且他們的代碼又長又亂,簡直是臭代碼,看都不想看的那種。
如今來貼一貼個人代碼。。。。。。
前端代碼:
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; //Layout = null; } <h2>熱門課程展現圖表</h2> <script src="~/Scripts/ECharts/echarts-all.js"></script> <div id="main" style="width: 600px;height: 400px;"></div> <script type="text/javascript"> var json; $.ajax({ type: "post", url: "/CourseCount/GetCourse", dataType: 'JSON', success: function (data) { json = JSON.parse(data); myChart.setOption({ title: { text: '熱門課程前三甲' }, tooltip: {}, legend: { data: ['選課人數'] }, xAxis: { data: json.name }, yAxis: {}, series: [{ name: '選課人數', type: 'line', data: json.count }] }); } }); //將echart初始化到div中 var myChart = echarts.init(document.getElementById('main')); //指定圖表的配置項和數據 </script>
而後是後端代碼:
public ActionResult GetCourse() { string [] Name=new string [3]; int[] Count=new int[3]; string sql = "select top 3 a.ClassName,b.SelectCount from Course a inner join (select ClassNumber,COUNT(*) SelectCount from SelectCourse group by ClassNumber) b on a.ClassNumber=b.ClassNumber order by SelectCount desc"; SqlHelper sqlHelper = new SqlHelper(); DataTable dataTable = sqlHelper.SqlConnectionInformation(sql); for (int i = 0; i < dataTable.Rows.Count; i++) { Name[i] = dataTable.Rows[i]["ClassName"].ToString(); Count[i] = int.Parse(dataTable.Rows[i]["SelectCount"].ToString()); } var EName = JsonConvert.SerializeObject(Name); var ECount = JsonConvert.SerializeObject(Count); string json = $"{{\"name\":{EName},\"count\":{ECount}}}"; return Json(json); }
就是這麼簡單啊,json序列化和解析一下就完事了
獲取select標籤下全部的option內容,undo_redo_to是select標籤的id,緊接着option
var test= $("#undo_redo_to option").map(function () { return $(this).val(); }).get().join(", ")
我學習了一個新的方法,不使用ajax了,使用Jquery封裝的getJson吧,而後DataTable經過LinQ的方式去轉化成List,再直接JSon序列化
這個和5.5日更新的那個後端代碼能夠比較一下,我以爲這個比較好一點。
前端:(寫了一個下拉框作測試)
@{ ViewBag.Title = "Home Page"; } <script src="~/Scripts/jquery-3.3.1.js"></script> <div> <table> <tr> <td> <label class="control-label">姓名:</label> </td> <td> <select name="name" id="name" style="width:200px;" class="form-control"></select> </td> </tr> </table> </div> <script> $(function () { $('#name').empty(); var url = '/Home/ReturnJson'; $.getJSON(url, function (json, textStatus) { for (var i = 0; i < json.length; i++) { $('#name').append('<option value="' + json[i].Number + '">' + json[i].Name + '</option>') }; }); }) </script>
後端這裏就好玩了:
public JsonResult ReturnJson() { string sql = "select AccountNumber,Name from [dbo].[SysUser]"; DAL.SqlHelper sqlHelper = new DAL.SqlHelper(); DataTable dataTable = sqlHelper.SqlConnectionInformation(sql); var list = ( from d in dataTable.AsEnumerable() select new User { Number = d.Field<string>("AccountNumber"), Name = d.Field<string>("Name") } ).ToList(); return Json(list,JsonRequestBehavior.AllowGet); }
嘖嘖,真簡潔,那個User是一個類,本身寫一個就行了,以下:
public class User { public string Number { get; set; } public string Name { get; set; } }
作一個東西,不太會,拖拖拉拉的,大佬要求我今天必須完成。我中午都不睡覺了,趕緊懟代碼。結果又學到了一點東西。
首先看一棵樹
這是一棵樹,我如今要刪除一個節點。
1.利用數據庫範式去try catch
try { DelAddressIncludeSub(ds.Tables[0], id); return MessageSuccess(); } catch { return MessageFalse("沒法刪除有設備的構築物!"); }
我之前還會考慮,萬一這個樹形節點其餘地方有用到怎麼辦?還得去寫一個連表查詢啥的,是我多慮了。若是其餘表的數據和這個樹形節點是有外鍵,主鍵什麼的關係的,這樣就創建起一個數據庫範式,這樣是不容許你直接刪除這個外鍵主鍵依據的,因此,直接一個try catch就完事了。
2.利用遞歸去刪除樹形節點
刪除樹形節點的時候,要考慮子節點的問題。這個東西呢我應該不知道怎麼解決。遞歸這個知識之前都學過,可是我絕對想不起來用。。。
/// <summary> /// 遞歸刪除樹節點,包括子節點 /// </summary> /// <param name="id"></param> private void DelAddressIncludeSub(DataTable dt, int id) { DataRow[] drList = dt.Select("ParentID=" + id.ToString()); for (int i = 0; i < drList.Length; i++) { int ID = Convert.ToInt32(drList[i]["ID"].ToString()); DelAddressIncludeSub(dt, ID); } new EQ_TypeGradeDAL().Delete(id); }
看,就這樣,遞歸着刪除,就完事了。
講了上面兩個收穫,其實今天還有一個大的收穫。能夠改變我今後寫代碼的方法思路。
MVC分層!面向對象!
我之前寫代碼 這裏是個人一些感悟,先不寫,沒時間。。。。
昨天作了一個跳轉的功能,以爲頗有意思。能夠學習一下。是這樣的。一個數據庫上有4個廠,由於用戶名是主鍵,不能重複,那我只能保證用戶名不同。可是有的領導用戶想訪問這4個廠。那我只好這樣。
Vae1,Vae2,Vae3,Vae4
就這樣,一個用戶Vae,搞了4個帳號,這樣很麻煩,領導不肯意記。
因而我就搞了一個跳轉登陸的功能。在.Net MVC技術中是這樣滴!
http://localhost:46418/?userid=Vae1
我只須要不停的去修改個人userid的用戶名就能夠實現登陸進不一樣的系統了,連密碼都不須要輸入!很是好。我實現的具體步驟是這樣的。
1.先登陸進系統,獲取我當前的用戶名,而且截取個人純淨用戶名,不加什麼123
//獲取當前用戶的登陸帳號,純淨的 function getName() { var id = '@userID'; if (@fid==998) { return id; } else if (@fid== 9) { return id.substring(0, id.length - 3); } else if (@fid==35) { return id.substring(0, id.length - 2); } else if (@fid==36) { return id.substring(0, id.length - 2); } }
大概就是這樣,這裏的length減2減3是個人命名規則而已。例如Vae111,Vae22,Vae33。固然,實際狀況下用字母代替。大家本身準備命名規則。
2.獲取了我當前的純淨用戶名,那我如今要獲取當前的localhost
var curWwwPath = window.document.location.href; var pathName = window.document.location.pathname; var pos = curWwwPath.indexOf(pathName); var localhostPaht = curWwwPath.substring(0, pos);
寫到一個js方法裏面就能夠獲取當前的localhost啦,就是http://localhost:46418/
3.彈出一個選擇框,讓我選擇去點擊其它廠。layer是Jquery的一個彈出插件。
layer.open({ type: 1, title: '請選擇跳轉單位', skin: 'layui-layer-rim', //加上邊框 area: [factorywindowwidth, factorywindowheigh], //寬高 content: '<table class="table table-striped table-bordered"><tr><td><a href="' + localhostPaht + '?userid=' + setName(998)+'" class="btn btn-white btn-primary" id="jtselectfatory_999" style="margin-bottom: 5px;">我是大廠</a> </tr>' + '<tr><td>水廠</td></tr>' + '<tr><td><a href="' + localhostPaht + '?userid=' + setName(9) + '" class="btn btn-white btn-primary" id="jtselectfatory_1" style="margin-bottom: 5px;">小廠1</a> <a href="' + localhostPaht + '?userid=' + setName(35) + '" class="btn btn-white btn-primary" id="jtselectfatory_3" style="margin-bottom: 5px;">小廠2</a> <a href="' + localhostPaht + '?userid=' + setName(36) +'" class="btn btn-white btn-primary" id="jtselectfatory_5" style="margin-bottom: 5px;">小廠3</a> </tr>' }); $('#jtselectfatory_' + $.cookie('jtselectfatory_id')).css("cssText", "background-color:#cccccc!important;margin-bottom: 2px;");
4.寫方法,去跳轉拼接。其實在3裏面已經能夠看到。我寫了 <a href="' + localhostPaht + '?userid=' + setName(9) + '"
能夠看到,我調用了setName方法,以下:
//獲取當前用戶的登陸帳號,純淨的 function setName(factoryid) { if (factoryid == 998) { return getName(); } else if (factoryid == 9) { var name = "111"; return getName()+name; } else if (factoryid == 35) { var name = "22"; return getName()+name; } else if (factoryid == 36) { var name = "33"; return getName()+name; } }
差很少就是這樣。
前端js怎麼取獲取當前月的天數呢?若是考慮閏年平年什麼的很麻煩,這裏有一個方法,能夠很方便的得出月份的天數。我奇怪的是js沒有內置一些時間函數嗎。。。
function getMonthDays(year, month) { var thisDate = new Date(year, month, 0); //當天數爲0 js自動處理爲上一月的最後一天 return thisDate.getDate(); }
就是這個方法,複製進你的代碼,傳入年和月就能夠了
使用MVC發佈的時候,沒有js這些靜態文件,並且個人項目裏面的js都是灰色的,如圖:
正是因爲這些灰色的js,致使了運行的時候代碼沒問題,可是發佈的時候js都沒有發佈,緣由是由於沒有包含在項目裏,這樣解決
點亮他們,完事
我發現Razor的上面會寫一個
@{
}
而後這裏面都是ViewBag啥的傳過來的值,想要調用的話直接使用@+名字就能夠了,計算什麼的最好在Conroller裏面計算好
@if (excessStockBid.PriceType != BillType.RMB) { <text>html += ('<td data-title="人民幣報價"><input type="text" id = "RMBPrice[' + bidListCount + ']" class="form-control input-sm number" value="0.00" onchange="CheckUpRate(' + bidListCount + ')" />');</text> }
在Razor裏面,寫@if就可使用C#裏面的類了。可是若是裏面想寫html又不行了,可使用<text>標籤括起來。
下面的Vue,我不知道爲何這兩個if else不能起做用。因此我只能在js裏面判斷了
<input type="text" class="form-control input-sm" id="ExchangeRate" name="stockOrder.ExchangeRate" required v-if="stockOrder.PriceType=='RMB'" value="1" /> <input type="text" class="form-control input-sm" id="ExchangeRate" name="stockOrder.ExchangeRate" required v-else v-model="stockOrder.ExchangeRate" />
if (stockOrder.PriceType == 'RMB') { stockOrder.ExchangeRate = 1; }