asp.net MVC 常用知识汇总

.NET兼职社区
.NET兼职社区
.NET兼职社区

一、@RenderSection

在ASP.NET Core中,_Layout.cshtml 文件是用于定义共享布局的文件。布局文件通常包含整个应用程序中通用的HTML结构,如头部、导航栏和脚部等内容。@RenderSection 方法用于在布局文件中定义一个可选或必需的部分,该部分可以在子视图中填充内容。

比如:

@RenderSection("Metas", required: false)
  • “Metas”:这是部分的名称。你可以在子视图中使用相同的名称来填充这部分内容。
  • required: false:这是一个布尔值,表示该部分是否是必需的。如果设置为 false,则子视图可以选择性地填充该部分;如果设置为
    true,则子视图必须填充该部分,否则会引发异常。

示例
布局文件 _Layout.cshtml

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>@ViewData["Title"] - My Application</title>
    <link rel="stylesheet" href="~/css/site.css" />
    @RenderSection("Metas", required: false)
</head>
<body>
    <header>
        <nav>
            <!-- 导航栏内容 -->
        </nav>
    </header>
    <main>
        @RenderBody()
    </main>
    <footer>
        <!-- 底部内容 -->
    </footer>
</body>
</html>

子视图 Index.cshtml

@{
    ViewData["Title"] = "Home Page";
}

@section Metas {
    <meta name="description" content="This is the home page of my application.">
    <meta name="keywords" content="home, application, ASP.NET Core">
}

<h1>Welcome to the Home Page</h1>
<p>This is the home page of my application.</p>

解释
布局文件 _Layout.cshtml:

  • 在 部分,使用 @RenderSection(“Metas”, required: false) 定义了一个名为
    “Metas” 的部分,并指定该部分是可选的。
  • 如果子视图中没有定义 @section Metas,则布局文件会忽略该部分,不会引发任何错误。

子视图 Index.cshtml:

  • 在视图中,使用 @section Metas 定义了 “Metas” 部分的内容。
  • 这部分内容将被插入到布局文件中定义的 @RenderSection(“Metas”, required: false) 的位置。

效果
当你访问 Index.cshtml 视图时,最终生成的HTML将会包含你在子视图中定义的元标签(meta tags):

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Home Page - My Application</title>
    <link rel="stylesheet" href="/css/site.css" />
    <meta name="description" content="This is the home page of my application.">
    <meta name="keywords" content="home, application, ASP.NET Core">
</head>
<body>
    <header>
        <nav>
            <!-- 导航栏内容 -->
        </nav>
    </header>
    <main>
        <h1>Welcome to the Home Page</h1>
        <p>This is the home page of my application.</p>
    </main>
    <footer>
        <!-- 底部内容 -->
    </footer>
</body>
</html>

总结

  • @RenderSection(“Metas”, required: false):在布局文件中定义一个名为 “Metas”
    的部分,并指定该部分是可选的。
  • 子视图可以使用 @section Metas 来填充这部分内容。
  • 如果子视图没有定义该部分,布局文件会忽略该部分,不会引发错误。

二、辅助属性

在ASP.NET Core MVC框架中,<a>标签内的属性如asp-controller、asp-action和asp-area是用来生成链接的辅助属性。这些属性是Razor视图引擎的一部分,用于帮助开发者更容易地创建指向控制器动作的链接。下面是对每个属性的解释:

  • asp-controller:指定要链接到的控制器名称。控制器是处理用户请求并返回响应的核心组件之一。例如,如果你有一个名为MoviesController的控制器,那么你可以使用asp-controller="Movies"来指定链接应该指向这个控制器。
  • asp-action:指定控制器中的特定动作方法。动作方法是控制器类中的公共方法,它们负责处理特定类型的HTTP请求(如GET或POST)。例如,如果你想链接到MoviesController中的Index方法,可以使用asp-action=“Index”。
  • asp-area:用于指定区域。区域是一种组织大型应用程序的方法,它允许你在同一个项目中拥有多个小型MVC结构。每个区域可以有自己的控制器、模型和视图。如果某个链接指向的是特定区域内的控制器和动作,就需要使用asp-area属性来指明区域名称。如果不涉及区域,则可以省略此属性或者将其值设为空字符串""。

示例解析
原来的链接:

<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">MvcMovie</a>

这个链接会生成一个指向HomeController的Index方法的URL,同时指定了空的区域(意味着没有使用区域功能)。
修改后的链接:

<a class="navbar-brand" asp-controller="Movies" asp-action="Index">Movie App</a>

这个链接会生成一个指向MoviesController的Index方法的URL,没有指定区域,因此默认不会涉及到区域。

总结
这些属性使得在ASP.NET Core应用中创建动态链接变得非常方便。它们不仅能够确保链接的正确性,还能够在路由配置发生变化时自动调整链接地址,从而提高开发效率和代码的可维护性。点击带有 asp-controller 和 asp-action 属性的 <a> 标签时,浏览器会发送一个 HTTP 请求到服务器,请求的目标是由这些属性指定的控制器和动作方法。Razor 视图引擎在渲染页面时会解析这些属性并生成正确的 URL。

三、page

作用:指定当前文件是一个Razor页面。
示例

@page
@model MyNamespace.Pages.IndexModel
@{
    ViewData["Title"] = "Home Page";
}
<h1>Welcome to the Home Page</h1>

四、inject

作用:注入服务到视图中,使其可以在视图中使用。
示例

@inject MyService MyServiceInstance



<p>@MyServiceInstance.GetMessage()</p>

五、section

作用:定义一个可以在布局页面中引用的部分。
示例

@section Scripts {
    <script src="~/js/my-script.js"></script>
}

<!DOCTYPE html>
<html>
<head>
    <title>@ViewData["Title"]</title>
</head>
<body>
    @RenderBody()
    @RenderSection("Scripts", required: false)
</body>
</html>

六、inherits

作用:指定视图继承的基类。
示例

@inherits MyCustomBasePage

七、 授权过滤器(Authorization Filters)

授权过滤器用于在操作方法执行之前进行身份验证和授权检查。如果授权失败,请求可能会被终止。

public class MyAuthorizationFilter : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // 自定义授权逻辑
        return base.AuthorizeCore(httpContext);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // 处理未授权请求
        base.HandleUnauthorizedRequest(filterContext);
    }
}

八、操作过滤器(Action Filters)

操作过滤器在操作方法执行前后执行。它们可以用于修改操作方法的输入参数或输出结果。

public class MyActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // 在操作方法执行前执行
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // 在操作方法执行后执行
        base.OnActionExecuted(filterContext);
    }
}

九、结果过滤器(Result Filters)

结果过滤器在操作结果执行前后执行。它们可以用于修改操作结果的输出。

public class MyResultFilter : ResultFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        // 在操作结果执行前执行
        base.OnResultExecuting(filterContext);
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        // 在操作结果执行后执行
        base.OnResultExecuted(filterContext);
    }
}

十、异常过滤器(Exception Filters)

异常过滤器用于捕获并处理操作方法或结果执行过程中抛出的异常。

public class MyExceptionFilter : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        // 处理异常
        if (filterContext.ExceptionHandled)
        {
            // 异常已处理
        }
        else
        {
            // 异常未处理,可以在这里记录日志或返回自定义错误页面
            filterContext.Result = new ViewResult { ViewName = "Error" };
            filterContext.ExceptionHandled = true;
        }
    }
}

十一、过滤器全局注册

Global.asax.cs 文件的 Application_Start 方法中注册全局过滤器。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new MyAuthorizationFilter());
        filters.Add(new MyActionFilter());
        filters.Add(new MyResultFilter());
        filters.Add(new MyExceptionFilter());
    }
}

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值