ViewData.ModelMetadata.Properties

194
04 января 2019, 14:40

В поиске решения - в соседней теме подсказали как верно реализовать задачу. Реализовал, работает частично. Проблема в одном: По какой-то причине ((int)property.Order по всем позициям равен 10000. Хотя в базе и в помине нет у данного логина этих значений...

View:

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<Resource> Localizer
@{
    ViewData["Title"] = @Localizer["Achievement.Achievements"];
}
@if (User.Identity.IsAuthenticated)
{
    @foreach (Web.Models.DataBase.Achievements info in ViewBag.info)
    {
        <div class="panel panel-default inf-content">
            <div class="panel panel-default">
                <div class="panel-heading clearfix">
                    <div class="text-muted pull-left"><h4>@Localizer["Achievement.Achievements"]</h4></div>
                </div>
            </div>
            <div class="panel-body text-muted">
                <div class="form-horizontal">
                    <div class="row">
                        @await Html.PartialAsync("_AccountMenu")
                        @await Html.PartialAsync("_Achievements", info)
                    </div>
                </div>
            </div>
        </div>
    }
}

Partial:

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<Resource> Localizer
@using Microsoft.AspNetCore.Mvc.ModelBinding
@{
    Dictionary<string, int> Achs = new Dictionary<string, int>() {
{"Achievement1", 3 },
{"Achievement2", 300 },
{"Achievement3", 500000 },
{"Achievement4", 150 },
{"Achievement5", 50000 },
{"Achievement6", 1000 },
{"Achievement7", 1000 },
{"Achievement8", 50 },
{"Achievement9", 25 },
{"Achievement10", 25 },
{"Achievement11", 10 },
{"Achievement12", 75 },
{"Achievement13", 250 },
{"Achievement14", 250 },
{"Achievement15", 300 },
{"Achievement16", 300 },
{"Achievement17", 300 },
{"Achievement18", 100 },
{"Achievement19", 100 },
{"Achievement20", 500 },
{"Achievement21", 500 },
{"Achievement22", 100 },
{"Achievement23", 100 },
{"Achievement24", 100000 },
{"Achievement25", 30 },
{"Achievement26", 5 },
{"Achievement27", 10 },
{"Achievement28", 5 },
{"Achievement29", 50 },
{"Achievement30", 30 },
{"Achievement31", 3 },
{"Achievement32", 300 },
{"Achievement33", 300 },
{"Achievement34", 300 },
{"Achievement35", 300 },
{"Achievement36", 300 },
{"Achievement37", 300 },
{"Achievement38", 300 },
{"Achievement39", 300 },
{"Achievement40", 300 },
{"Achievement41", 3 },
{"Achievement42", 300 },
{"Achievement43", 300 },
{"Achievement44", 300 },
{"Achievement45", 300 },
{"Achievement46", 300 },
{"Achievement47", 300 },
{"Achievement48", 300 },
{"Achievement49", 300 },
{"Achievement50", 300 }
};
    int title = 1;
    int info = 1;
}
@foreach (ModelMetadata property in ViewData.ModelMetadata.Properties)
{
    if (property.PropertyName.StartsWith("Achievement"))
    {
        <div class="col-md-6">
            <div class="well well-sm">
                <div class="row">
                    <div class="col-xs-3 col-md-3 text-center">
                        <img src="@string.Format("/images/achievements/{0}.png", property.PropertyName)" alt="Achievement"
                             class="img-rounded img-responsive" />
                    </div>
                    <div class="col-xs-9 col-md-9 section-box">
                        <span class="ach-title-size">
                            @Localizer["Achievement.Title" + title++]
                            @if ((int)property.Order >= Achs[property.PropertyName] / 3)
                            {
                                <span class="pull-right glyphicon glyphicon-star text-warning"></span>
                            }
                            else
                            {
                                <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
                            }
                            @if ((int)property.Order >= Achs[property.PropertyName] / 3 * 2)
                            {
                                <span class="pull-right glyphicon glyphicon-star text-warning"></span>
                            }
                            else
                            {
                                <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
                            }
                            @if ((int)property.Order >= Achs[property.PropertyName])
                            {
                                <span class="pull-right glyphicon glyphicon-star text-warning"></span>
                            }
                            else
                            {
                                <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
                            }
                        </span>
                        <p class="achievement-text-size">
                            @Localizer["Achievement.Info" + info++]
                        </p>
                        @if ((int)property.Order >= Achs[property.PropertyName])
                        {
                            <span class="text-warning">Выполнено!</span>
                        }
                        else
                        {
                            <span class="pull-right achievement-text-size">
                                @property.Order<span>/</span>@Achs[property.PropertyName]
                            </span>
                            <div class="row rating-desc">
                                <div class="col-md-12">
                                    <div class="achievement-progress">
                                        <progress max="@Achs[property.PropertyName]" value="@((int)(int)property.Order)">
                                        </progress>
                                    </div>
                                </div>
                            </div>
                        }
                    </div>
                </div>
            </div>
        </div>
    }
}

Всем заранее спасибо за любой совет!

Answer 1

В ASP.NET Core свойство ModelMetadata.Model изменилось на ModelMetadata.PropertyGetter. Это делегат, позволяющий вычислить значение любой произвольной модели, а не какой-то заранее заданной. Вот так: @property.PropertyGetter(Model).

READ ALSO
Wpf DataContext и потоки

Wpf DataContext и потоки

Вопрос скорее идеологический, как правильно подходить к задаче обновления данных в ModelView

179
HtmlAgilityPack не видит элемент по XPath

HtmlAgilityPack не видит элемент по XPath

Проблема следующая, на html странице есть элемент

401
Получить список хуков

Получить список хуков

Можно ли получить список глобальных хуков, которые установлены в системе в данный момент?

172
Уникальные значения HashSet vs Distinct

Уникальные значения HashSet vs Distinct

Замер скоростей поиска уникальных значений показал разницу в 2 раза

206