【问题标题】:Using Display(Name while creating <li>在创建 <li> 时使用 Display(Name
【发布时间】:2017-07-20 15:02:09
【问题描述】:

我正在尝试本地化一个开源项目,但我遇到了枚举字符串。

我的 Enum.cs 是;

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Web;


namespace TestSite.Domain.Models

    {
    public enum SortSpan
        {
            /// <summary>
            /// Default value
            /// </summary>
            [Display(Name = "Hepsi")]
            All = 0,

            /// <summary>
            /// Span aralığını 1 saate indirger
            /// </summary>
            [Display(Name = "Saat")]
            Hour,

            /// <summary>
            /// Span aralığını 1 güne indirger
            /// </summary>
            [Display(Name = "Gün")]
            Day,

            /// <summary>
            /// Span aralığını 1 haftaya indirger
            /// </summary>
            [Display(Name = "Hafta")]
            Week,

            /// <summary>
            /// Span aralığını 1 aya indirger
            /// </summary>
            [Display(Name = "Ay")]
            Month,

            /// <summary>
            /// Limits search span to ~90 days
            /// </summary>
            [Display(Name = "Mevsim")]
            Quarter,

            /// <summary>
            /// Limits search span to 1 year
            /// </summary>
            [Display(Name = "Yıl")]
            Year
        }
    }

我为枚举 SortSpan 上的每个字符串提供 [Display(Name = "...")]。 但在视图中它总是看到字符串名称而不是 DisplayName。

这是视图;

   @*Top Sort Span Buttons*@
        @if (Model.Context != null && Model.Sort == TestSite.Domain.Models.SortAlgorithm.Top)
        {
            <div>
                <ul class="tabmenu submenu">
                    @{
                        var spans = new SortSpan[] { SortSpan.Day, SortSpan.Week, SortSpan.Month, SortSpan.Quarter, SortSpan.Year, SortSpan.All };
                        foreach (var span in spans)
                        {
<li class='@(Model.Span.HasValue && Model.Span.Value == span ? "selected" : "disabled")'>
@Html.RouteLink(span.ToString(), Model.Submissions.RouteName, new { sort = (Model.Sort == null ? "" : Model.Sort.ToString().ToLower()), span = span.ToString().ToLower() })
</li>
                        }
                    }
                </ul>
            </div>
        }

这是现场截图; It still shows as Day, Week, Month..

但是我想用 Gün, Ay, Yıl 来改变它们,如你所见 [Display(Name = "Gün)]...

谢谢..

更新:完整的视图代码 (.cshtml)

@using Voat.Domain.Models

@model Voat.Models.ViewModels.SubmissionListViewModel

@{
    ViewBag.Title = Model.Title;
    ViewBag.Description = Model.Description;
    int counter = 0;
}

@section PageHeader {
    @if (Model.IsActualSubverse)
    {
        @Html.Partial("_SubverseStylesheetLink", Model.Context.Name, new ViewDataDictionary())
    }
}

<style type="text/css">
    body > .content .link .rank {
        width: 3.2ex;
    }
</style>

<div id="container">
    @if (Model.IsActualSubverse)
    {
        @Html.Action("SidebarForSelectedSubverse", "Subverses", new { selectedSubverse = Model.Context.Name })
    }
    else if (Model.Context != null && Model.Context.Type == Voat.Domain.Models.DomainType.Set)
    {
        @Html.Action("Sidebar", "Set", new { name = Model.Context.FullName })
    }
    else
    {
        @Html.Partial("~/Views/Shared/Sidebars/_SidebarFrontpage.cshtml")
    }

    <div class="content" role="main">

    @*Top Sort Span Buttons *@
    @if(Model.Context != null && Model.Sort == Voat.Domain.Models.SortAlgorithm.Top)
    {
        <div>
            <ul class="tabmenu submenu">
                @{
                    var spans = new SortSpan[] { SortSpan.Day, SortSpan.Week, SortSpan.Month, SortSpan.Quarter, SortSpan.Year, SortSpan.All };
                    Type type = typeof(SortSpan);
                    foreach (var span in spans)
                    {
                        SortSpan sortSpan = SortSpan.All;                               
                        Type type = typeof(SortSpan);
                        MemberInfo[] memberInfo = type.GetMember(sortSpan.ToString());
                        object[] attributes = memberInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
                        string name = ((DisplayAttribute)attributes[0]).Name;   
                        <li class='@(Model.Span.HasValue && Model.Span.Value == span ? "selected" : "disabled")'>@Html.RouteLink(name, Model.Submissions.RouteName, new { sort = (Model.Sort == null ? "" : Model.Sort.ToString().ToLower()), span = name.ToLower() })</li>
                    }
                }
            </ul>
        </div>
    }

        <div class="sitetable linklisting">
            @if (Model.IsActualSubverse)
            {
                @Html.Action("StickiedSubmission", "Subverses", new { subverseName = Model.Context.Name })
            }
            else if (Model.Context == null || (Model.Context != null && Model.Context.Type != DomainType.Set))
            {
                @Html.Partial("~/Views/Welcome/_FirstTimeVisitorWelcome.cshtml")
                @Html.Action("FeaturedSub", "Home")
                @Html.Action("StickiedSubmission", "Home")
            }

            @if (Model.Submissions.Count <= 0)
            {
                Html.RenderPartial("_DefaultMessage", new ViewDataDictionary() {{"selectedSubverse", Model.Context.Name}});
            }

            @foreach (var submission in Model.Submissions)
            {
                @Html.Partial("~/Views/Shared/Submissions/_Submission.cshtml", submission, new ViewDataDictionary() { { "CssClass", new string[] { counter % 2 == 0 ? "even" : "odd" } } })
                counter++;
            }
        </div>

        @{
            Model.Submissions.RouteData = Request.RequestContext.RouteData.Values;
            if (Model.Sort != null)
            {
                Model.Submissions.RouteData["sort"] = Model.Sort.ToString().ToLower();
            }
            if (Model.Span != null)
            {
                Model.Submissions.RouteData["span"] = Model.Span.ToString().ToLower();
            }
            if (!String.IsNullOrEmpty(Request.QueryString["frontpage"]))
            {
                Model.Submissions.RouteData["frontpage"] = Request.QueryString["frontpage"];
            }
        }
        @Html.DisplayFor(model => Model.Submissions, "IPaginatedList")

        @*<div class="pagination-container">
            <ul>
                @if (Model.Submissions.HasPreviousPage)
                {
                    <li class="btn-whoaverse-paging">
                        @Html.RouteLink("< prev", Model.Submissions.RouteName, new {
                       page = (Model.Submissions.PageIndex - 1),
                       sort = (Model.Sort == null ? "" : Model.Sort.ToString().ToLower()),
                       time = (Model.Span == null ? "" : Model.Span.ToString().ToLower()),
                       frontpage = Request.QueryString["frontpage"]
                   }, new {rel = "prev"})
                    </li>
                }

                @if (Model.Submissions.HasNextPage)
                {
                    <li class="btn-whoaverse-paging">
                        @Html.RouteLink("next >", Model.Submissions.RouteName, new {
                       page = (Model.Submissions.PageIndex + 1),
                       sort = (Model.Sort == null ? "" : Model.Sort.ToString().ToLower()),
                       time = (Model.Span == null ? "" : Model.Span.ToString().ToLower()),
                       frontpage = Request.QueryString["frontpage"]
                   }, new { rel = "next" })
                    </li>
                }
            </ul>
        </div>*@

        @if (!Model.IsActualSubverse)
        {
            <div>
                <a href="/random">rastgele evren getir</a> veya <a href="/randomnsfw">rastgele NSFW evren getir </a>
            </div>
        }
    </div>
</div>

【问题讨论】:

  • 我也试过了,但它对我不起作用,我不知道为什么。实际上,我不擅长 ASP 和 C#,所以这门语言对我来说有点陌生。但是当我尝试该解决方案时,我遇到了关于“描述”的错误。我认为我在尝试此解决方案时编辑视图时做错了。

标签: c# asp.net asp.net-mvc razor enums


【解决方案1】:

这对我有用。

SortSpan sortSpan = SortSpan.All;                               
Type type = typeof(SortSpan);
MemberInfo[] memberInfo = type.GetMember(sortSpan.ToString());
object[] attributes = memberInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
string name = ((DisplayAttribute)attributes[0]).Name;

我使用了来自此链接的答案Getting attributes of Enum's value

[更新] 这是合并后的代码。它没有经过测试,只是用文本编辑器编辑过。

 @*Top Sort Span Buttons *@
    @if(Model.Context != null && Model.Sort == TestSite.Domain.Models.SortAlgorithm.Top)
    {
        < div >
            < ul class="tabmenu submenu">
                @{
                    var spans = new SortSpan[] { SortSpan.Day, SortSpan.Week, SortSpan.Month, SortSpan.Quarter, SortSpan.Year, SortSpan.All };
                    Type type = typeof(SortSpan);
                    foreach (var span in spans)
                    {
                        MemberInfo[] memberInfo = type.GetMember(span.ToString());
                        object[] attributes = memberInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
                        string name = ((DisplayAttribute)attributes[0]).Name;
                        <li class='@(Model.Span.HasValue && Model.Span.Value == span ? "selected" : "disabled")'>@Html.RouteLink(name, Model.Submissions.RouteName, new { sort = (Model.Sort == null ? "" : Model.Sort.ToString().ToLower()), span = name.ToLower() })</li>
                    }
                }
            </ul>
        </div>
    }

【讨论】:

  • 以前见过这个,但它对我不起作用或者我无法实现它:D。谢谢。
  • 您好,Ben,当我在您发送的 enums.cs 中插入第一个代码时出现错误。我已将包含错误的行加粗。 SortSpan sortSpan = SortSpan.All;类型 type = typeof(SortSpan); MemberInfo[] memberInfo = type.GetMember(sortSpan.ToString()); object[] 属性 = memberInfo**[0].GetCustomAttributes(typeof(DisplayAttribute), false); string **name = ((DisplayAttribute)**attributes**[0]).Name;
  • 你能发布一些错误吗?没有它很难回答;)
  • 大声笑,我不知道我应该将您发送的第一个代码添加到哪里,所以我将第一个代码添加到 enums.cs 并用我的视图代码替换了第二个代码 :) 让我发布作为答案,因为我无法在 cmets 上添加图像。
  • 好的,这是错误:sortSpan Errors.
【解决方案2】:

你最好使用EnumHelper.GetSelectList辅助方法

<ul class="tabmenu submenu">
    @{    
        foreach (SelectListItem span in EnumHelper.GetSelectList(typeof(SortSpan)))
        {
            <li class='@(Model.Span.HasValue && Model.Span.Value.ToString() == span.Value ? "selected" : "disabled")'>
                @Html.RouteLink(span.Text, Model.Submissions.RouteName, new { sort = (Model.Sort == null ? "" : Model.Sort.ToString().ToLower()), span = span.Text.ToLower() })
            </li>
        }
    }
</ul>

【讨论】:

  • 使用此方法时出错。 “编译器错误消息:CS0019:运算符'=='不能应用于'TestSite.Domain.Models.SortSpan'和'string'类型的操作数”第68行:
  • "
  • 尝试更改为 Model.Span.Value.ToString() == span.Value
  • 它似乎有效,但它只是从上到下获取枚举的显示名称,但代码失去了它的功能。按钮不再正常工作。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签