Отображение пользовательского сообщения об ошибке в ASP.Net 5, MVC 6

У меня есть один метод, который вызывает метод API. Этот метод API содержит операторы SQL вставки, обновления, удаления. Но когда какая-либо ошибка выдается из хранимой процедуры, как отобразить ее впереди как сообщение об ошибке. Я использую ASP.NET 5 и MVC 6. Мой метод выглядит следующим образом:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Method(Model model)
{
    string url = ConfigurationSettingHelper.BaseUrl + "apiurl";

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = await client.PostAsJsonAsync<Model>(url, model);

        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
            var Msg = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(data);

            if (!string.IsNullOrEmpty(Convert.ToString(Msg)))
            {
                //Here code to display error message.
            }
        }
    }
    return View();
}

Помогите мне отобразить строковое сообщение переменной Msg на странице.

Благодарю вас


person iDipa    schedule 18.01.2016    source источник
comment
Вы имеете в виду как Response.Write(Msg); ?   -  person Matheno    schedule 18.01.2016
comment
Да, только так, но это не поддерживается в ASP.Net 5. Любой другой метод?   -  person iDipa    schedule 18.01.2016


Ответы (2)


Я думаю, есть несколько способов добиться этого.

1) Используйте ViewModel, который может хранить List<string> Errors, который вы можете передать обратно в свое представление. Хотя сделать это для всех представлений было бы очень повторяющимся и непростым в обслуживании.

2) Используйте TempData для хранения сообщений об ошибках, а не в вашей ViewModel. Таким образом, вы можете проверить в своем _Layout.cshtml, есть ли какие-либо элементы в TempData, и отобразить их любым способом (это произойдет со всеми вашими представлениями).

3) Используйте toastr.js и подход TempData, чтобы вместо этого отобразить приятный тост. Начните с реализации POCO, который включает Enum для различных типов ответов, доступных в toastr.js, т. е. Error, Info, Success, Warning. Затем создайте файл BaseController.cs, который будут реализовывать ваши контроллеры, см. пример ниже.

Затем в ваших контроллерах вы можете вызвать CreateNotification(AlertType.Error, "Это тестовое сообщение.", "Ошибка");

Наконец, вам нужно поместить логику в файл _Layout.cshtml, чтобы использовать уведомления. Убедитесь, что вы добавили ссылку на toastr.js и его CSS-файл, и см. ниже пример того, как его подключить:

Полный пример:

Уведомление.cs

```

public class Alert
{
    public AlertType Type { get; set; }
    public string Message { get; set; }
    public string Title { get; set; }
}

public enum AlertType
{
    Info,
    Success,
    Warning,
    Error
}

```

BaseController.cs

public override void OnActionExecuting(ActionExecutingContext context)
    {            
        GenerateNotifications();    

        base.OnActionExecuting(context);
    }

public void CreateNotification(Notification.AlertType type, string message, string title = "")
    {
        Notification.Alert toast = new Notification.Alert();
        toast.Type = type;
        toast.Message = message;
        toast.Title = title;

        List<Notification.Alert> alerts = new List<Notification.Alert>();

        if (this.TempData.ContainsKey("alert"))
        {
            alerts = JsonConvert.DeserializeObject<List<Notification.Alert>>(this.TempData["alert"].ToString());
            this.TempData.Remove("alert");
        }

        alerts.Add(toast);

        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.All
        };

        string alertJson = JsonConvert.SerializeObject(alerts, settings);

        this.TempData.Add("alert", alertJson);
    }

    public void GenerateNotifications()
    {
        if (this.TempData.ContainsKey("alert"))
        {               
            ViewBag.Notifications = this.TempData["alert"];
            this.TempData.Remove("alert");
        }
    }

Макет.cshtml

@if (ViewBag.Notifications != null)
    {
        JsonSerializerSettings settings = new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All
    };
    List<Notification.Alert> obj = JsonConvert.DeserializeObject<List<Notification.Alert>>(ViewBag.Notifications, settings);

    foreach (Notification.Alert notification in obj)
    {
        switch (notification.Type)
        {
            case Notification.AlertType.Success:
                <script type="text/javascript">toastr.success('@notification.Message', '@notification.Title');</script>
                break;
            case Notification.AlertType.Error:
                <script type="text/javascript">toastr.error('@notification.Message', '@notification.Title');</script>
                break;
            case Notification.AlertType.Info:
                <script type="text/javascript">toastr.info('@notification.Message', '@notification.Title');</script>
                break;
            case Notification.AlertType.Warning:
                <script type="text/javascript">toastr.warning('@notification.Message', '@notification.Title');</script>
                break;
        }
    }
}
person Ian Auty    schedule 18.01.2016
comment
эй, можете ли вы предоставить какой-либо рабочий пример вашего третьего решения ?? - person Null Pointer; 17.06.2017
comment
Я расширил пример, чтобы показать класс и перечисление, которые необходимо добавить. Осталось только добавить включения CSS/JS в представление для toastr.js. - person Ian Auty; 19.06.2017
comment
Отличный ответ очень помог, но у меня проблема: если вы вернете представление (модель) - с ошибкой - метод OnActionExecuting не запускается - как это исправить? Спасибо - person Jenan; 19.11.2017
comment
Я не уверен, что полностью вас понимаю - что вы имеете в виду, возвращая View () с ошибкой? Вы говорите, что где-то в вашем коде создается исключение до того, как представление будет возвращено? - person Ian Auty; 21.11.2017

Вы можете использовать Response.Write(str) как в коде программной части, так и на странице .ASPX:

<%
Response.Write(str)
%>

Использование Response.Write() в отделенном коде помещает строку перед HTML-кодом страницы, поэтому это не всегда полезно.

Вы также можете создать серверный элемент управления где-нибудь на странице ASPX, например метку или литерал, и установить текст или значение этого элемента управления в коде программной части:

.ASPX:

<asp:Label id="lblText" runat="server" />

Код программной части:

lblText.Text = "Hello world"

Вывод в HTML:

<span id="lblText">Hello World</span>

Если вы не хотите добавлять s, используйте литерал:

<asp:Literal id="litText" runat="server" />

И установите атрибут value литерала вместо текстового атрибута:

litText.Value = "Hello World"
person Matheno    schedule 18.01.2016
comment
У меня не было страницы aspx. страница просмотра - это страница .cshtml - person iDipa; 18.01.2016
comment
Я предлагаю вам следовать руководству - person Matheno; 18.01.2016