.NetCore-MVC
.NetCore MVC
这个是我自己记得笔记,最好有点基础看我的。
html 辅助标签
@html.Raw("
标题
")正常渲染html字符串@Html.DropList
分布视图
使用 RenderPartialAsync 呈现分部视图。 此方法不返回 IHtmlContent。 它将呈现的输出直接流式传输到响应。 因为该方法不返回结果,所以必须在 Razor 代码块内调用它:微软推荐
@{
await Html.RenderPartialAsync("_AuthorPartial");
}
由于 RenderPartialAsync 流式传输呈现的内容,因此在某些情况下它可提供更好的性能。 在性能起关键作用的情况下,使用两种方法对页面进行基准测试,并使用生成更快响应的方法。
分布视图通常放在当前需要用到分布视图的view文件夹下或者sharp文件夹下
JS,Css捆绑(.net5下)
.net6,7,8应该也可以用吧
模型校验
模型上添加校验特性
【RegularExpression("")】还可以添加 lamda表达式
@Html.ValidationMessageFor()可以显示校验错误
js引入也可以写分布视图,这样改的时候好改
后端校验
后端校验失败可以用ValidationSummary显示·传参true排除属性错误。
模型加上后,label不用写labeltext。
模型绑定
一个对象中有另一个对象,前段想给内部对象ProductCategory的CategoryName属性赋值
应该这样binding
[Bind]可以省略,默认全部binding
[formquery][formbody][formform]绑定
[formquery]
还可以这样
http:127.0.0.1/ControllerName/Search?startprice=1&name=互动&endprice=2
public ActionResult Search(int startprice, string name, int endprice)
{
// 直接使用这三个参数进行业务处理
// startprice 会被赋值为 1
// name 会被赋值为 "互动"
// endprice 会被赋值为 2
return View();
}
--参数名称必须与 URL 中的查询参数名称完全一致(区分大小写)
--如果 URL 中缺少某个参数,且方法参数是值类型(如 int),会抛出异常
--若参数可能为空,建议使用可空类型,例如:
public ActionResult Search(int? startprice, string name, int? endprice)
不同标签可以结合,相同标签只能写一个,([formquery],[formquery])不行
下面这样query和heard可以
[FromHeader]
header特殊可以重复
不能写中文
[FromBody]
只能接受json,post请求
[FromForm]
常用来表单提交
[FormRoute]
获取路由参数
[HttpGet("{id}/{name}")]
public IActionResult GetData(int id, string name)
{
// 直接使用 id 和 name 参数
return Ok($"ID: {id}, Name: {name}");
}
此时,访问 api/控制器名/123/测试 会自动将:
123 绑定到 id 参数
测试 绑定到 name 参数
2. 使用 [FromRoute] 特性(显式指定)
如果参数名与路由占位符不一致,或为了代码更清晰,可以使用 [FromRoute] 特性显式指定绑定来源:
csharp
[HttpGet("{id}/{name}")]
public IActionResult GetData(
[FromRoute(Name = "id")] int dataId, // 绑定路由中的 id 到 dataId 参数
[FromRoute(Name = "name")] string userName) // 绑定路由中的 name 到 userName 参数
{
return Ok($"DataID: {dataId}, UserName: {userName}");
}
3. 使用复杂类型接收
如果参数较多,也可以定义一个类来接收所有路由参数:
csharp
public class MyRequest
{
public int Id { get; set; }
public string Name { get; set; }
}
[HttpGet("{id}/{name}")]
public IActionResult GetData([FromRoute] MyRequest request)
{
return Ok($"ID: {request.Id}, Name: {request.Name}");
}
注意事项:
路由模板中的占位符名称(id、name)必须与参数名(或 [FromRoute(Name)] 指定的名称)完全匹配
参数类型会自动转换(如字符串 "123" 转换为 int 123),转换失败会返回 400 错误
若需要可选参数,可在路由模板中使用 ? 标记(如 {id?}),并将参数设为可空类型(如 int? id)
layout布局
_ViewStatrt.cshtml
通常view.cshtml,如果你想对全部的cshtml起作用就放在Shared文件夹,对特定的,如HomeController对应的Home文件下的cshtml起作用,不想让其他文件用,就放在Views/Home文件夹下,就近原则。
例如
_ViewImport.cshtml
标签助手
推荐使用标签助手代替html辅助标签
@addtaghelpers *,使Microsoft.AspNetCore.mvc.TagHelpers 类在我们所有 Razor 视图中可用
可以用了
怎么用
这个图很好解释了
<partial name="Shared/_ProductPartial.cshtml" for="Product">
model 属性分配模型实例,以传递到分部视图。model 属性不能与 for 属性一起使用。
在以下标记中,实例化新的 Product 对象并将其传递给 model 属性进行绑定:
<partial name="_ProductPartial" model='new Product { Number = 1, Name = "Test product", Description = "This is a test" }'>
view-data 属性分配 ViewDataDictionary,以传递到分部视图。以下标记使整个 ViewData 集合可访问分部视图:
@{
ViewData["IsNumberReadOnly"] = true;
}
<partial name="_ProductViewDataPartial" for="Product" view-data="ViewData">
在前面的代码中,IsNumberReadOnly 键值设置为 true 并添加到 ViewData 集合中。因此,在以下分部视图中可访问 ViewData["IsNumberReadOnly"]:
@model TagHelpersBuiltIn.Models.Product
<div class="form-group">
<label asp-for="Number"></label>
@if ((bool)ViewData["IsNumberReadOnly"])
{
<input asp-for="Number" type="number" class="form-control" readonly />
}
else
{
<input asp-for="Number" type="number" class="form-control" />
}
</div>
<div class="form-group">
<label asp-for="Name"></label>
<input asp-for="Name" type="text" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Description"></label>
<textarea asp-for="Description" rows="4" cols="50" class="form-control"></textarea>
</div>
自定义标签助手
定义
推荐看例子
// 作用于所有包含 "my-id" 属性的 <div> 标签
[HtmlTargetElement("div", Attributes = "my-id")]
// 作用于所有以 "my:" 为前缀的标签(如 <my:card>)
[HtmlTargetElement("", TagStructure = TagStructure.NormalOrSelfClosing, Prefix = "my")]
例子
创建新标签
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Threading.Tasks;
[HtmlTargetElement("current-time")]
public class TimeTagHelper : TagHelper
{
[HtmlAttributeName("format")]
public string Format { get; set; } = "yyyy-MM-dd HH:mm:ss";
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
// 显式指定输出为 <span> 标签(关键修正)
output.TagName = "span";
// 设置内容
var currentTime = DateTime.Now.ToString(Format);
output.Content.SetContent(currentTime);
// 添加样式类
output.Attributes.SetAttribute("class", "time-display");
return Task.CompletedTask;
}
}
2
在 _ViewImports.cshtml 中添加命名空间引用(确保与标签助手类的命名空间一致)
@addTagHelper *, 你的项目名称
3
<!-- 使用默认格式 -->
<current-time></current-time>
<!-- 自定义格式 -->
<current-time format="yyyy年MM月dd日"></current-time>
<span class="time-display">2025-09-05 14:30:00</span>
<span class="time-display">2025年09月05日</span>
关键知识点解析
标签命名:
通过 [HtmlTargetElement("标签名")] 定义标签名称
支持匹配现有标签(如 [HtmlTargetElement("a")] 可增强 <a> 标签)
属性绑定:
使用 [HtmlAttributeName("属性名")] 定义标签可接受的属性
属性值会自动绑定到类的对应属性
输出控制:
TagHelperOutput 对象用于控制最终输出的 HTML
可以修改标签名称(output.TagName = "div")、添加属性、设置内容等
生命周期方法:
重写 Process() 或 ProcessAsync() 方法实现核心逻辑
异步操作优先使用 ProcessAsync()
增强现有标签
[HtmlTargetElement("a", Attributes = "external")]
public class ExternalLinkTagHelper : TagHelper
{
// 匹配标签中的 external 属性(无需值,存在即可)
[HtmlAttributeName("external")]
public bool IsExternal { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (IsExternal)
{
output.Attributes.SetAttribute("target", "_blank");
output.Attributes.SetAttribute("rel", "noopener noreferrer");
}
}
}
<!-- 浏览器会自动添加 target 和 rel 属性 -->
<a href="https://example.com" external>外部链接</a>
更多输出控制示例:
csharp
// 1. 输出为 div 标签
output.TagName = "div";
// 2. 移除标签,只输出内容(无外层标签)
output.TagName = null;
// 3. 添加自定义属性
output.Attributes.Add("data-time", DateTime.Now.Ticks);
// 4. 修改或移除原有属性
output.Attributes.RemoveAll("format"); // 移除传入的format属性,避免输出到HTML
// 5. 设置标签内部的HTML(注意XSS风险)
output.Content.SetHtmlContent($"<strong>{currentTime}</strong>");
通过这些控制,你可以完全自定义标签助手最终生成的 HTML 结构,让自定义标签既易用又符合标准 HTML 规范。
视图组件
第二种我不行
传参
区域
建一个文件夹,鼠标添加区域,MVC里的
红框内保持一致
mvc的视图注入