ASP.NET将UserControl转换为Razor Partial View:处理财产



我有这个UserControl,我想转换为剃须刀部分视图。它是将插入_layout文件中的标题。复制HTML非常直接...但是我该如何处理该属性?

显示页面时,我想以不同的方式显示活动菜单项,因此每个页面都在page_load中设置MasterPage.activeIndex。

所以问题的第一部分是,我该如何处理剃须刀部分视图中的属性?

问题的第二部分是,如何在_layout文件中处理以提供所需功能?

<%@ Control Language="C#" AutoEventWireup="true" %>
<script runat="server">
    public int ActiveIndex { get; set; }
</script>
<ul class="clearfix">
    <li <%= ActiveIndex == 0 ? "class="active"" : "" %>><a href="~/" runat="server">Home  </a></li>
    <li <%= ActiveIndex == 1 ? "class="active"" : "" %>><a href="~/mission" runat="server">Our Mission  </a></li>
    <li <%= ActiveIndex == 2 ? "class="active"" : "" %>><a href="~/books" runat="server">Books </a></li>
    <li <%= ActiveIndex == 3 ? "class="active"" : "" %>><a href="~/bulk-order" runat="server">Bulk Order</a></li>
    <li <%= ActiveIndex == 4 ? "class="active"" : "" %>><a href="~/book-accuracy-list" runat="server">Book Accuracy List</a></li>
    <li <%= ActiveIndex == 5 ? "class="active"" : "" %>><a href="~/contact" runat="server">Contact Us</a></li>
</ul>

答案是使用页面上的ViewData将数据传递到布局,并且是子视图。

在页面上

@page
@{
    ViewData["ActiveIndex"] = 2;
    ViewData["Title"] = "Books";
    ViewData["Description"] = "";
    ViewData["Keywords"] = "";
}

在布局中,我像这样显示标题

<partial name="_Header" model='new _HeaderModel((int?)ViewData["ActiveIndex"])' />

然后,标头可以作为模型的一部分具有强大的参数,并从构造函数中取出。

public class _HeaderModel : PageModel {
    public int? ActiveIndex { get; set; }
    public _HeaderModel() { }
    public _HeaderModel(int? activeIndex) {
        this.ActiveIndex = activeIndex;
    }
}

添加了助手方法

HtmlString ActiveTag(int index) => new HtmlString(index == ActiveIndex ? @"class=""active""" : "");

然后这条旧线

<li <%= ActiveIndex == 0 ? "class="active"" : "" %>

变成

<li @ActiveTag(0)>

将WebForms重构为Razor页面需要一些工作,但始终导致代码少得多:)

最新更新