主頁 > .NET開發 > 篇(15)-入門實戰-權限管理之用戶創建與關聯角色(ViewModel再用與模型驗證一)

篇(15)-入門實戰-權限管理之用戶創建與關聯角色(ViewModel再用與模型驗證一)

2022-11-20 06:14:00 .NET開發

篇(15)-Asp.Net Core入門實戰-權限管理之用戶創建與關聯角色(ViewModel再用與模型驗證一)

在上個篇章中,講了角色和選單的關系(也就是給角色賦權),本章講用戶和給用戶分派角色的功能,如果是小白,最好是仔細看我寫的代碼,因為關鍵代碼處都有注解,建議將篇14和篇15閱讀完畢再做演練,為防止單篇過長,我將其分成2篇來講解,

用戶與角色的處理邏輯是:(1).用戶的增刪改查;(2).給用戶選一個所屬角色,

1.用戶管理功能

(1).用戶表(Sql庫)的創建

CREATE TABLE [dbo].[Manager](
[Id] [int] IDENTITY(1,1) NOT NULL,
[RoleId] [int] NOT NULL,
[UserName] [varchar](32) NOT NULL,
[Password] [varchar](128) NOT NULL,
[Avatar] [varchar](256) NULL,
[NickName] [varchar](32) NULL,
[Mobile] [varchar](16) NULL,
[Email] [varchar](128) NULL,
[LoginCount] [int] NULL,
[LoginLastIp] [varchar](64) NULL,
[LoginLastTime] [datetime] NULL,
[AddManagerId] [int] NOT NULL,
[AddTime] [datetime] NOT NULL,
[ModifyManagerId] [int] NULL,
[ModifyTime] [datetime] NULL,
[IsLock] [bit] NOT NULL,
[IsDelete] [bit] NOT NULL,
[Remark] [varchar](128) NULL,
CONSTRAINT [PK_MANAGER] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

 

(2).用戶Model的撰寫,這個Model直接與Sql表的結構一致,

public class Manager
{
/// <summary>
/// 主鍵 MaxLength屬性作用于字串,不能用在int型別上
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
/// 角色ID
/// </summary>
public int RoleId { get; set; }
/// <summary>
/// 用戶名
/// </summary>
[Required]
public String UserName { get; set; }
/// <summary>
/// 密碼
/// </summary>
public String Password { get; set; }
/// <summary>
/// 頭像
/// </summary>
public String Avatar { get; set; }
/// <summary>
/// 用戶昵稱
/// </summary>
public String NickName { get; set; }
/// <summary>
/// 手機號碼
/// </summary>
public String Mobile { get; set; }
/// <summary>
/// 郵箱地址
/// </summary>
public String Email { get; set; }
/// <summary>
/// 登錄次數
/// </summary>
public int? LoginCount { get; set; }
/// <summary>
/// 最后一次登錄IP
/// </summary>
public String LoginLastIp { get; set; }
/// <summary>
/// 最后一次登錄時間
/// </summary>
public DateTime? LoginLastTime { get; set; }
/// <summary>
/// 添加人
/// </summary>
[Required]
public int AddManagerId { get; set; }
/// <summary>
/// 添加時間
/// </summary>
[Required]
public DateTime AddTime { get; set; }
/// <summary>
/// 修改人
/// </summary>
public int? ModifyManagerId { get; set; }
/// <summary>
/// 修改時間
/// </summary>
[MaxLength(23)]
public DateTime? ModifyTime { get; set; }
/// <summary>
/// 是否鎖定
/// </summary>
[Required]
public Boolean IsLock { get; set; }
/// <summary>
/// 是否洗掉
/// </summary>
[Required]
public Boolean IsDelete { get; set; }
/// <summary>
/// 備注
/// </summary>
public String Remark { get; set; }
}

 

(3).用戶View部分的撰寫

(3.1)視圖View部分包括用戶的增、刪、改、查功能,還有對應的修改用戶角色,修改用戶密碼,

(3.2)Create視圖代碼如下

@{ ViewData["Title"] = "新建用戶"; }
@model RegisterManagerView
@section Scripts{
<script type="text/javascript" src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script type="text/javascript" src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<form action="/Manager/Create" method="post">
@Html.AntiForgeryToken()
<div>
<label asp-for="UserName">用戶名</label>
<div>
<input type="text" asp-for="UserName" name="UserName" placeholder="用戶名">
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Password">密碼</label>
<div>
<input type="password" asp-for="Password" name="Password" placeholder="密碼" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="ConfirmPassword">確認密碼</label>
<div>
<input type="password" asp-for="ConfirmPassword" name="ConfirmPassword" placeholder="確認密碼" />
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Mobile">手機號</label>
<div>
<input type="text" asp-for="Mobile" name="Mobile" placeholder="手機號">
<span asp-validation-for="Mobile" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Email">Email</label>
<div>
<input type="text" asp-for="Email" name="Email" placeholder="郵箱">
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Remark">介紹</label>
<div>
<textarea name="Remark" asp-for="Remark" placeholder="相關介紹"></textarea>
</div>
</div>
<div>
<div>
<button type="submit">確定</button>
<button type="reset">重置</button>
</div>
</div>
</form>

 

(3.3)Edit視圖代碼如下

@{ ViewData["Title"] = "編輯用戶"; }
@model EditManagerView
@section Scripts{
<script type="text/javascript" src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script type="text/javascript" src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<form action="/Manager/Edit" method="post">
@Html.AntiForgeryToken()
<div>
<label asp-for="UserName">用戶名</label>
<div>
<input type="text" asp-for="UserName" name="UserName" placeholder="用戶名">
<span asp-validation-for="UserName" class="text-danger"></span>
<input type="hidden" asp-for="Id" />
</div>
</div>
<div>
<label asp-for="Mobile">手機號</label>
<div>
<input type="text" asp-for="Mobile" name="Mobile" placeholder="手機號">
<span asp-validation-for="Mobile" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Email">Email</label>
<div>
<input type="text" asp-for="Email" name="Email" placeholder="郵箱">
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="Remark">介紹</label>
<div>
<textarea name="Remark" asp-for="Remark" placeholder="相關介紹"></textarea>
</div>
</div>
<div>
<div>
<button type="submit">確定</button>
<button type="reset">重置</button>
</div>
</div>
</form>

 

(3.4)Index視圖代碼如下(串列頁)

@using Humanizer;
@using RjWebCms.Db;
@model PaginatedList<PageManager>
@{
ViewData["Title"] = "用戶串列";
}
@section Scripts{
<script src="~/js/jquery-3.6.1.min.js"></script>
<script type="text/javascript">
function DelAll() {
var ids = document.getElementsByName("#chk_ids");
var arrIds = "";
var n = 0;
for (var i = 0; i < ids.length; i++) {
if (ids[i].checked == true) {
arrIds += ids[i].value + ",";
n++;
}
}
if (n == 0) {
alert("請選擇要洗掉的資訊");
return;
}

arrIds = arrids.substr(0, arrIds.length - 1);
//
if (confirm("確定要全部洗掉選擇用戶嗎")) {
$.ajax({
type: "post",
url: "/Manager/DeleteAll",
data: { ids: arrIds },
success: function (data, state) {
alert('洗掉成功!');
window.location.href = "";
},

error: function (data, state) {
alert('洗掉失敗');
}
});
}
}
</script>
}
<div class="panel panel-default todo-panel">
@Html.AntiForgeryToken()
<form asp-action="Index" method="get">
<table>
<tr><td><a asp-controller="Manager" asp-action="Create">添加</a></td></tr>
<tr>
<td>查詢關鍵詞:<input type="text" name="SearchString" value="@ViewData["CurrentFilter"]" /></td>
<td><input type="submit" value="查詢" /></td>
<td><a asp-action="Index">Back</a></td>
<td><a id="DelAll" name="DelAll">批量洗掉</a></td>
</tr>
</table>
</form>
<table class="table table-hover">
<thead>
<tr>
<td>&#x2714;</td>
<td><a asp-action="Index" asp-route-sortOrder="@ViewData["NameSortParm"]" asp-route-currentFilter="@ViewData["CurrentFilter"]">用戶名</a></td>
<td>角色名</td>
<td>手機號</td>
<td><a asp-action="Index" asp-route-sortOrder="@ViewData["DateSortParm"]" asp-route-currentFilter="@ViewData["CurrentFilter"]">時間</a></td>
<td>操作</td>
</tr>
@foreach (var item in Model)
{
<tr>
<td><input type="checkbox" class="done-checkbox" name="chk_ids" value="@item.Id"></td>
<td>@item.UserName</td>
<td>@item.RoleName</td>
<td>@item.Mobile</td>
<td>@item.AddTime</td>
<td>
<a asp-controller="Manager" asp-action="Details" asp-route-id="@item.Id">View</a>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a>
<a asp-action="ChangeRole" asp-route-id="@item.Id">ChangeRole</a>
<a asp-action="ChangePass" asp-route-id="@item.Id">ChangePass</a>
<a asp-controller="Manager" asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</thead>
</table>
@{
var prevDisabled = !Model.HasPreviousPage ? "disabled" : "";
var nextDisabled = !Model.HasNextPage ? "disabled" : ""; ;
}
<a asp-action="Index"
asp-route-sortOrder="@ViewData["CurrentSort"]"
asp-route-pageNumber="@(Model.PageIndex - 1)"
asp-route-currentFilter="@ViewData["CurrentFilter"]"
class="btn btn-default @prevDisabled">
上一頁
</a>
<a asp-action="Index"
asp-route-sortOrder="@ViewData["CurrentSort"]"
asp-route-pageNumber="@(Model.PageIndex + 1)"
asp-route-currentFilter="@ViewData["CurrentFilter"]"
class="btn btn-default @nextDisabled">
下一頁
</a>
<div class="panel-footer add-item-form">
<!-- TODO: Add item form -->
</div>
</div>

 

(3.5)ChangePass視圖代碼

@model ChangePassView
@section Scripts{
<script type="text/javascript" src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script type="text/javascript" src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<form action="/Manager/ChangePass" method="post">
@Html.AntiForgeryToken()
<div>
<label asp-for="OldPass">舊密碼</label>
<input type="hidden" asp-for="Id" />
<div>
<input type="password" asp-for="OldPass" name="OldPass" placeholder="密碼" />
<span asp-validation-for="OldPass" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="NewPass">新密碼</label>
<div>
<input type="password" asp-for="NewPass" name="NewPass" placeholder="密碼" />
<span asp-validation-for="NewPass" class="text-danger"></span>
</div>
</div>
<div>
<label asp-for="ConfirmNewPass">確認新密碼</label>
<div>
<input type="password" asp-for="ConfirmNewPass" name="ConfirmNewPass" placeholder="確認密碼" />
<span asp-validation-for="ConfirmNewPass" class="text-danger"></span>
</div>
</div>
<div>
<div>
<button type="submit">確定</button>
<button type="reset">重置</button>
</div>
</div>
</form>

 

(3.6)ChangeRole視圖代碼

@using RjWebCms.Models;
@{ ViewData["Title"] = "修改對應角色"; }
@model ChangeUserRole
<form action="/Manager/ChangeRole" method="post">
@Html.AntiForgeryToken()
<div>
<label asp-for="Id">選擇對應角色</label>
<input type="hidden" asp-for="Id" />
<div>
@Html.DropDownList("ddl_RoleList", ViewBag.database as IEnumerable<SelectListItem>)
</div>
</div>
<div>
<div>
<button type="submit">確定</button>
<button type="reset">重置</button>
</div>
</div>
</form>

 

 

(4).用戶Controller部分的實作

public class ManagerController : Controller{
  private readonly IManagerService _manager;
  private readonly IManagerRoleService _managerRoleService;
  private readonly AppDbContext _appDbContext;
  public ManagerController(IManagerService manager,IManagerRoleService managerRoleService, AppDbContext appDbContext){
    _manager = manager;
    _managerRoleService = managerRoleService;
    _appDbContext = appDbContext;
  }
  public async Task<IActionResult> Index(string sortOrder, string currentFilter, string searchString, int? pageNumber){
    ViewData["CurrentSort"] = sortOrder;
    ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
    ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
  if (searchString != null)
  {
    pageNumber = 1;
  }
  else
  {
    searchString = currentFilter;
  }

#region 分頁操作資料
ViewData["CurrentFilter"] = searchString;
var managers = from s in _appDbContext.Manager
join t in _appDbContext.ManagerRole on s.RoleId equals t.Id
select new PageManager{
Id=s.Id,
RoleId =s.RoleId,
UserName = s.UserName,
Email = s.Email,
Mobile = s.Mobile,
AddTime = s.AddTime,
RoleName = t.RoleName};
if (!string.IsNullOrEmpty(searchString))
{
managers = managers.Where(s => s.UserName.Contains(searchString));
}
switch (sortOrder)
{
case "name_desc":
managers = managers.OrderByDescending(s => s.UserName);
break;
case "Date":
managers = managers.OrderBy(s => s.AddTime);
break;
case "date_desc":
managers = managers.OrderByDescending(s => s.AddTime);
break;
default:
managers = managers.OrderBy(s => s.UserName);
break;
}

#endregion
int pageSize = 4;
return View(await PaginatedList<PageManager>.CreateAsync(managers.AsNoTracking(), pageNumber ?? 1, pageSize));
}

[HttpGet]
public IActionResult Create()
{
return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(RegisterManagerView manager)
{
if (ModelState.IsValid)
{
Manager mUser = new Manager
{
UserName = manager.UserName,//但暫時用重寫的方式來處理
Password = AESEncryptHelper.Encode(manager.Password.Trim(), RjWebKeys.AesEncryptKeys), //對密碼加密;
Mobile = manager.Mobile,
Email = manager.Email,
Remark = manager.Remark
};
//此處可以用AutoMapper進行轉換
//因為AddManagerAsync的引數是Manager物件,而非RegisterManagerView物件
//否則就需要重寫一個AddManagerAsync(RegisterManagerView manager) 這樣的方法
var successful = await _manager.AddManagerAsync(mUser);
if (successful)
return RedirectToAction("Index");
else
return BadRequest("失敗");
}
return View(manager);
}

[HttpGet]
public async Task<IActionResult> Edit(int id)
{
if (string.IsNullOrEmpty(id.ToString()))
return NotFound();
var m = await _manager.FindManagerAsync(id);
if (m == null)
return NotFound();
EditManagerView mView = new EditManagerView() {
Id = id,
UserName = m.UserName,
//Password = AESEncryptHelper.Decode(m.Password,RjWebKeys.AesEncryptKeys), //解密密碼
//ConfirmPassword = AESEncryptHelper.Decode(m.Password, RjWebKeys.AesEncryptKeys), //解密密碼
Mobile = m.Mobile,
Email = m.Email,
Remark = m.Remark
};
return View(mView);
}

[HttpPost]
public async Task<IActionResult> Edit(int id, EditManagerView editManager)
{
if (string.IsNullOrEmpty(id.ToString()))
return NotFound();
if (ModelState.IsValid)
{
try
{
//做個物件轉換
Manager mUser = new Manager {
UserName = editManager.UserName,
Mobile = editManager.Mobile,
Email = editManager.Email,
Remark = editManager.Remark
};
//因為UpdateManagerAysnc方法引數為完整Manger物件,所以要轉換
var result = await _manager.UpdateManagerAysnc(id, mUser);
if(result)
return RedirectToAction("Index");
else
return BadRequest("編輯失敗");
}

catch (Exception ex)
{
return BadRequest("編輯失敗");
}
}

return View();
}

public async Task<IActionResult> Details(int id)
{
var item = await _manager.FindManagerAsync(id);
return View(item);
}

public async Task<IActionResult> Delete(int id)
{
var result = await _manager.DeleteManagerAsync(id);
if (result)
return RedirectToAction("Index");
else
return Ok("洗掉失敗!");
}
[HttpGet]
public async Task<IActionResult> ChangePass(int id)
{
if (string.IsNullOrEmpty(id.ToString()))
return NotFound();
//密碼框的初始化也可以省略
var m = await _manager.FindManagerAsync(id);
if (m == null)
return NotFound();
ChangePassView cpView = new ChangePassView {
Id=id,
OldPass = AESEncryptHelper.Decode(m.Password, RjWebKeys.AesEncryptKeys) //解密密碼m.Password,
};
return View(cpView);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ChangePass(int id,ChangePassView cheView)
{
if (string.IsNullOrEmpty(id.ToString()))
return NotFound();
if (ModelState.IsValid)
{
//ChangePass方法在ManagerService中,注意引數物件
var successful = await _manager.ChangePass(id,cheView);
if (successful)
return RedirectToAction("Index");
else
return BadRequest("失敗");
}
return View();
}

[HttpGet]
public async Task<IActionResult> ChangeRole(int id)
{
//本Action呼叫后,要初始化下拉框的選擇
var user = await _manager.FindManagerAsync(id);
if (user == null)
return NotFound();
#region 系結類別下拉框
var rolelist = await _managerRoleService.GetManagerRoleAsync();
var roleItems = new List<SelectListItem>()
{
new SelectListItem(){ Value=https://www.cnblogs.com/mushaobai/archive/2022/11/19/"0",Text="全部",Selected=true}
};

foreach (var role in rolelist)
{
SelectListItem item = new SelectListItem() { Value = https://www.cnblogs.com/mushaobai/archive/2022/11/19/role.Id.ToString(), Text = role.RoleName };
roleItems.Add(item);
}
//遍歷并選中(實作選中下拉框功能)
foreach (SelectListItem item in roleItems)
{
if (item.Value =https://www.cnblogs.com/mushaobai/archive/2022/11/19/= user.RoleId.ToString())
item.Selected = true;
}
ViewBag.database = roleItems;
#endregion
return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ChangeRole(int id ,ChangeUserRole user)
{
//修改用戶所屬角色
if (string.IsNullOrEmpty(id.ToString()))
return NotFound();
#region 取下拉選單值(RoleId)
string strRoleId = Request.Form["ddl_RoleList"];
if (!string.IsNullOrEmpty(strRoleId))
user.RoleId = int.Parse(strRoleId);
else
user.RoleId = 0;
#endregion
if (ModelState.IsValid)
{
try
{
//ChangeRole方法在ManagerService中,注意其引數
var result = await _manager.ChangeRole(id, user);
if (result)
return RedirectToAction("Index");
else
return BadRequest("編輯失敗");
}

catch (Exception ex)
{
return BadRequest("編輯失敗");
}
}
return View();
}

#region 驗證功能

[HttpGet]
public async Task<IActionResult> CheckUserName(string UserName)
{
//result=true,表示有這個用戶名,說明驗證失敗,無法添加
//那么return json 需要回傳一個false
bool result = await _manager.CheckUserName(UserName);
return Json(!result); //回傳結果必須是Json格式
}

[HttpGet]
public async Task<IActionResult> CheckMobile(string Mobile)
{
//result=true,表示有這個手機號,說明驗證失敗,無法添加
//那么return json 需要回傳一個false
bool result = await _manager.CheckMobile(Mobile);
return Json(!result); //回傳結果必須是Json格式
}

[HttpGet]
public async Task<IActionResult> CheckEmail(string Email)
{
//result=true,表示有這個郵箱,說明驗證失敗,無法添加
//那么return json 需要回傳一個false
bool result = await _manager.CheckEmail(Email);
return Json(!result); //回傳結果必須是Json格式
}

[HttpGet]
public async Task<IActionResult> CheckOldPass(int id,string oldpass)
{
//result=true,表示有這個舊密碼,說明驗證失敗,無法添加
//那么return json 需要回傳一個false
string strPass = AESEncryptHelper.Encode(oldpass.Trim(), RjWebKeys.AesEncryptKeys); //對密碼加密;
bool result = await _manager.CheckOldPass(id,strPass);
return Json(result); //回傳結果必須是Json格式
}
#endregion
}

 

2.用戶分配角色

分配角色在ChangeRole視圖頁面完成,注意閱讀其對應代碼;

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536168.html

標籤:.NET技术

上一篇:篇(14)-Asp.Net Core入門實戰-權限管理之角色編輯和賦權(ViewModel-DTO初探)

下一篇:代碼生成器(CodeBuilder) 2.9.4 穩定版

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more