JoshWigley Ответов: 1

Не знаете как приступить к размещению данных модели в поле зрения MVC


Привет,

Я довольно новичок в MVC (On and Off user) и изо всех сил пытаюсь понять, как получить данные из модели в представление.

В моем контроллере у меня есть метод, который запускает следующий код:

     var jsonClient = new WebClient();
    jsonClient.Credentials = new NetworkCredential(ApiUsername.apiUsername, ApiPassword.apiPassword);
    jsonClient.Headers.Set("Content-Type", "application/json");
    jsonClient.Headers.Set("Accept", "application/json");
    //Engine Info
    var radWatchList = jsonClient.DownloadString("http://APIURL:XXXX/api/watchlists/Radiology/alerts/active");
    var radAlertsToModel = JsonConvert.DeserializeObject<DashboardModel>(radWatchList).Data;

    return PartialView("~/Views/Radiology/RadPartialViews/RadiologyAlerts.cshtml");
}


Вот мой класс моделей

namespace Rhapsody_DashboardV6.Models
{
    public class DashboardModel
    {
        [JsonProperty("data")]
        public Data Data { get; set; }

        [JsonProperty("error")]
        public object Error { get; set; }
    }

    public class Data
    {
        [JsonProperty("alertCount")]
        public long AlertCount { get; set; }

        [JsonProperty("highestSeverity")]
        public string HighestSeverity { get; set; }

        [JsonProperty("alerts")]
        public Alert[] Alerts { get; set; }
    }

    public partial class Alert
    {
        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("alertName")]
        public string AlertName { get; set; }

        [JsonProperty("alertMnemonic")]
        public string AlertMnemonic { get; set; }

        [JsonProperty("alertDescription")]
        public string AlertDescription { get; set; }

        [JsonProperty("timestamp")]
        public string Timestamp { get; set; }

        [JsonProperty("state")]
        public string State { get; set; }

        [JsonProperty("severity")]
        public string Severity { get; set; }

        [JsonProperty("componentInfo")]
        public ComponentInfo ComponentInfo { get; set; }

        [JsonProperty("parameters")]
        public Parameter[] Parameters { get; set; }
    }

    public partial class ComponentInfo
    {
        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("folderPath")]
        public string FolderPath { get; set; }
    }

    public partial class Parameter
    {
        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("displayName")]
        public string DisplayName { get; set; }

        [JsonProperty("value")]
        public string Value { get; set; }
    }

}


Теперь если я поставлю точку останова на следующем фрагменте кода:

var radAlertsToModel = JsonConvert.DeserializeObject<DashboardModel>(radWatchList).Data;


Я вижу, что он правильно заполнил свойства модели всеми соответствующими ответами API. На данный момент я бы изначально использовал ViewBag, который отлично работает, однако, судя по чтению, Viewbag, похоже, довольно плохо принят сообществом MVC, и что я должен искать, чтобы сделать это через класс ViewModal.

Я хочу передать эти данные в частичное представление, так как у меня есть запущенный AJAX-скрипт, который обновляет частичное представление каждые 30 секунд, чтобы оно обновляло представление любыми новыми данными из API.

Это код в частичном представлении:


@model IEnumerable<Rhapsody_DashboardV6.Models.Alert>
<div class="radAlertsMainPanel">
    <div class="panel panel-default radAlertPanel">
        <div class="panel-body">
            <label>Active Alerts: </label>
            <div>
                @foreach (var item in Model)
                {
                    @Html.DisplayFor(modelItem => item.Id);
                    @Html.DisplayFor(modelItem => item.AlertDescription);
                    @Html.DisplayFor(modelItem => item.AlertMnemonic);
                    @Html.DisplayFor(modelItem => item.AlertName);
                }
            </div>
        </div>
    </div>
</div>


И это тот вид, на который будет "встроен" частичный вид:

@{
    ViewBag.Title = "Radiology Dashboard";
}

@model Rhapsody_DashboardV6.Models.Alert



<div id="radDashboard" class="radDashboard">
    <div id="radTitle" class="radTitle">
        <h1>Radiology Dashboard </h1>
    </div>
</div>

<div class="radIntStatDiv">
    <div id="radIntStat" class="radIntTitle">
        <h4>Interface Status</h4>
    </div>
</div>

<div class="grid">
    <span class="grid-item" id="TEST1"></span>
    <span class="grid-item" id="TEST2"></span>
    <span class="grid-item" id="TEST3"></span>
    <span class="grid-item" id="TEST4"></span>
    <div>

    </div>

</div>
<div class="radAlertsDiv">
    <div id="radAlerts">
        <h4>Radiology Alerts</h4>
    </div>
</div>

<div class="radAlerts">
    <div>
        <div id="RadiologyAlerts"></div>
    </div>
</div>


<div>
    <div>
        <div id="RadiologyInterfaceStatistics"></div>
    </div>
</div>
@Scripts.Render("~/Content/JavaScript/Radiology/radiologyPartialViews.js")


В консоли Google Chrome он просто указывает на ошибку 500 без дополнительной информации для этого частичного представления.

Я не уверен, какие следующие шаги мне нужно предпринять, чтобы получить эти данные в частичном представлении.


Если бы кто-нибудь мог указать мне правильное направление или дать несколько советов о том, что я делаю неправильно, это было бы очень ценно.

Большое Спасибо!

Что я уже пробовал:

Я просмотрел несколько страниц StackOverflow, а также следовал учебнику MVC по Microsoft, но потерпел неудачу.

Richard Deeming

Попробуйте переместить @model директива в верхнюю часть частичного вида:

@model Rhapsody_DashboardV6.Models.Alert
@{
    ViewBag.Title = "Radiology Dashboard";
}
...


Если он все еще не работает, изучите запрос на панели network в инструментах разработки Chrome и посмотрите на ответ. Если вы тестируете на своем локальном компьютере, вы должны получить подробное сообщение об ошибке, которое расскажет вам, в чем проблема.

1 Ответов

Рейтинг:
0

F-ES Sitecore

Вы передаете модель частичному виду так же, как и неполноценный вид

return PartialView("~/Views/Radiology/RadPartialViews/RadiologyAlerts.cshtml", radAlertsToModel);


Вам также нужно будет изменить атрибут "@model" на частичном представлении, чтобы он был DashboardModel, и соответственно изменить представление.


JoshWigley

Привет Sitecore,

Спасибо за предложение, я внес соответствующие изменения.

Первоначально я пытался сделать это с различными взаимодействиями оператора @model, но все, что я, похоже, получаю, - это сообщение об ошибке:

Не удалось загрузить ресурс: сервер ответил со статусом 500 (Внутренняя ошибка сервера)

Что тогда, неудивительно, не загружает частичный вид.