首页 > 解决方案 > 将 Razor 字段对象引用到因子 C# (MS-MVC 5)

问题描述

我正在尝试将 Razor 代码 (.cshtml) 中的字段引用分解到一个位置,以便它们更容易更改和复制。但它不起作用。它认为“fieldRef”对象是字段本身,因此标签在输出上读取“fieldRef”。

@{object fieldRef = null; }  

<div class="col-md-4">
    @{ fieldRef = Model.ExcludeWords;}

    @Html.LabelFor(Model => fieldRef, htmlAttributes:
        new { @class = "control-label", @style = "color:#004400" })

    @Html.EditorFor(Model => fieldRef,
        new
        {
            htmlAttributes = new
            {
                @class = "form-control"
            }
        })

    @Html.ValidationMessageFor(Model => fieldRef, "", new { @class = "text-danger" })
</div>
@* More fields to follow this pattern... *@

请注意,“fieldRef”被引用了 3 次。问题不是阻碍,但如果我能让参考文献工作,我可以简化很多编码任务。

标签: c#asp.net-mvcrazormodelrefactoring

解决方案


在 ASP.NET Core Razor Pages 中,我替换了以下内容:

<dl class="row">
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.Course.Title)
    </dt>
    <dd class="col-sm-10">
        @Html.DisplayFor(model => model.Course.Title)
    </dd>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.Course.Credits)
    </dt>
    <dd class="col-sm-10">
        @Html.DisplayFor(model => model.Course.Credits)
    </dd>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.Course.Department)
    </dt>
    <dd class="col-sm-10">
        @Html.DisplayFor(model => model.Course.Department.DepartmentID)
    </dd>
</dl>

和:

<dl class="row">
    @{ 
        await Template1(model => model.Course.CourseID);
        await Template1(model => model.Course.Title);
        await Template1(model => model.Course.CourseID);
        await Template2(model => model.Course.Department, model => model.Course.Department.DepartmentID);
    }
</dl>

其中Template1Template2在文件顶部定义:

@{ 
    async Task Template1<T>(Expression<Func<DeleteModel, T>> expr)
    {
            <dt class="col-sm-2">
                @Html.DisplayNameFor(expr)
            </dt>

            <dd class="col-sm-10">
                @Html.DisplayFor(expr)
            </dd>
    }

    async Task Template2<T1, T2>(Expression<Func<DeleteModel, T1>> expr_a, Expression<Func<DeleteModel, T2>> expr_b)
    {
            <dt class="col-sm-2">
                @Html.DisplayNameFor(expr_a)
            </dt>

            <dd class="col-sm-10">
                @Html.DisplayFor(expr_b)
            </dd>
    }

}

将此作为传递表达式的示例,这似乎是您的目标。


推荐阅读