c# - ASP.NET CORE 5 MVC 如何将导航栏链接到视图?
问题描述
我创建了一个项目,我可以在其中上传、下载、删除和预览文件。现在,我想为类别创建一个导航栏,以便上传者只能将文件上传到特定类别,因此当用户进入网站并想要访问该文档时,他必须点击导航栏中的特定类别,然后单击类别后才会显示文档。我怎样才能做到这一点?我将在下面留下我的剃须刀页面和控制器代码,非常感谢您!:
public class HomeController : Controller
{
FileClass fc = new FileClass();
List<Admin> adminModels = new List<Admin>();
interface Iuser
{
public string username { get; set; }
public string password { get; set; }
void IsEqualTo();
}
class User : Iuser
{
public string username { get; set; }
public string password { get; set; }
public void IsEqualTo()
{
throw new NotImplementedException();
}
}
class Admin : Iuser
{
public string username { get; set; }
public string password { get; set; }
public void IsEqualTo()
{
throw new NotImplementedException();
}
}
private readonly IWebHostEnvironment _iweb;
public HomeController(IWebHostEnvironment iweb)
{
_iweb = iweb;
}
[HttpPost]
public async Task<IActionResult> Index(IFormFile fifile)
{
string ext = Path.GetExtension(fifile.FileName);
var fisave = Path.Combine(_iweb.WebRootPath, "Uploads", fifile.FileName);
var stream = new FileStream(fisave, FileMode.Create);
await fifile.CopyToAsync(stream);
stream.Close();
return RedirectToAction("Index");
}
public IActionResult Index()
{
var displayfc = Path.Combine(_iweb.WebRootPath, "Uploads");
DirectoryInfo di = new DirectoryInfo(displayfc);
List<FileInfo> fileinfo = di.GetFiles().ToList(); ;
FileClass.Filename = fileinfo;
return View();
}
public IActionResult Delete(string filedel)
{
filedel = Path.Combine(_iweb.WebRootPath, "Uploads", filedel);
FileInfo fi = new FileInfo(filedel);
if (fi != null)
{
System.IO.File.Delete(filedel);
fi.Delete();
}
return RedirectToAction("Index");
}
public IActionResult DocumentViewer(string fileview)
{
return View(fc);
}
public async Task<IActionResult> Download(string filename)
{
if (filename == null)
return Content("filename is not avaiable");
var path = Path.Combine(_iweb.WebRootPath, "Uploads", filename);
var memory = new MemoryStream();
using (var stream = new FileStream(path, FileMode.Open))
{
await stream.CopyToAsync(memory);
}
memory.Position = 0;
return File(memory, GetContentType(path), Path.GetFileName(path));
}
private string GetContentType(string path)
{
var types = GetMimeTypes();
var ext = Path.GetExtension(path).ToLowerInvariant();
return types[ext];
}
private Dictionary<string, string> GetMimeTypes()
{
return new Dictionary<string, string>
{
{".txt", "text/plain"},
{".pdf", "application/pdf"},
{".doc", "application/vnd.ms-word"},
{".docx", "application/vnd.ms-word"},
{".xls", "application/vnd.ms-excel"},
{".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{".png", "image/png"},
{".jpg", "image/jpeg"},
{".jpeg", "image/jpeg"},
{".gif", "image/gif"},
{".csv", "text/csv"}
};
}
[HttpGet("denied")]
public IActionResult Denied()
{
return View();
}
[Authorize(Roles = "Admin")]
public IActionResult Secured()
{
return View();
}
[HttpGet("login")]
public IActionResult Login(string returnUrl)
{
ViewData["ReturnURL"] = returnUrl;
return View();
}
[HttpPost("login")]
public async Task<IActionResult> Validate(string username, string password, string returnUrl)
{
ViewData["ReturnUrl"] = returnUrl;
List<Iuser> utilizatori = new List<Iuser>();
utilizatori.Add(new User() { username = "username", password = "password" });
utilizatori.Add(new Admin() { username = "bobitza", password = "28" });
utilizatori.Add(new Admin() { username = "rares", password = "cretin" });
foreach (Iuser user in utilizatori)
{
if (user.username == username && user.password == password)
{
if (user is User)
{
var claims = new List<Claim>();
claims.Add(new Claim("username", username));
claims.Add(new Claim(ClaimTypes.Role, "User"));
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
await HttpContext.SignInAsync(claimsPrincipal);
}
else if (user is Admin)
{
var claims = new List<Claim>();
claims.Add(new Claim("username", username));
claims.Add(new Claim(ClaimTypes.Role, "Admin"));
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
await HttpContext.SignInAsync(claimsPrincipal);
}
}
}
TempData["Error"] = "Error. Username or Password is invlaid";
return View("login");
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync();
return Redirect("/");
}
}
这是剃须刀页面
<center>
<h1>Daca nici acu nu merge ... ma sinucid</h1>
<h2>Sa moara mama</h2>
<hr />
@if (User.IsInRole("Admin"))
{
<form methord="post" enctype="multipart/form-data" asp-controller="Home" asp-action="Index">
<input type="file" name="fifile" />
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Meniu de navigare</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Dropdown
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>
</ul>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
<input type="submit" value="Upload" />
<hr />
</form>}
<table class="table">
<tr>
<th>File Name</th>
</tr>
@foreach (var item in FileClass.Filename)
{
<tr>
<td>@item.Name</td>
<td><a href="@Url.Action("Download","Home",new { filename=item.Name })">Download</a></td>
@if (User.IsInRole("Admin"))
{
<td><a href="@Url.Action("Delete", "Home", new { filedel = item.Name })">Delete</a></td>
}
<td><a href="/Home/DocumentViewer/@item.Name">Viewer</a></td>
</tr>
}
</table>
</center>
这是文件模型
public class FileClass
{
public static List<FileInfo> Filename { get; set; } = new List<FileInfo>();
}
解决方案
推荐阅读
- airflow - 启用 API 身份验证时,Apache 气流 REST API 调用失败并出现 403 禁止
- python - 类型突变在 python 中很奇怪,为什么?
- go - 如何将 json 数据作为参数添加到 c.Body.Request?
- c# - 什么是正确的写法:else if (9
语法:
(9<result<16)
当我在我的 C# 代码中使用它时,它似乎是无效的。我希望 else if 语句考虑以下条件:当两个整数之和大于 9 且小于 16 时,并返回该行:“那是一个差的成绩”作为结果。但问题是把条件写成 (9
c# - 使用 c# 和 Epplus 将 excel 信息创建到数据表和数据集中
- python - OSError:放入的尺寸不匹配!4628344 != 330596
- python - 有没有办法创建一个枚举类来映射python中的不同日期格式?
- javascript - 模板内容未注入插槽
- javascript - 异步编程的回调方式如何保证回调函数只有在做完异步任务后才运行?
- unity3d - 旋转轮对撞机对象