Как вернуть тот же вид из пользовательского ExceptionFilter в MVC 5 - PullRequest
0 голосов
/ 21 мая 2018

Я использую специальный файл исключений для обработки исключений в одном месте.Согласно моему требованию к приложению, то же самое представление будет отображать сообщение об ошибке (бизнес / универсальное) поверх представления, но когда я использую приведенный ниже код для отображения исключения, оно показывает пустую страницу, но не возвращает представление после ошибки.Здесь я не получаю, как вернуть тот же вид с текущей привязанной моделью.

вот мой ExceptionFilter класс

public class AutoExceptionHandler : ActionFilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        Exception e = filterContext.Exception;

        ModelStateDictionary modelState = ((Controller)filterContext.Controller).ModelState;
        filterContext.ExceptionHandled = true;
        Handle(e, modelState);
    }

    public void Handle(Exception ex, ModelStateDictionary modelState)
    {
        string message = "";
        Int32? auditLogID;
        Type typ = ex.GetType();
        if (typ == typeof(IE.Factory.Http.HttpResponseException))
        {
            message = ex.Message;
        }
        else
        {
            message = MessageChannel.Instance.GetMessageDescription("GENERIC_ERR_MSG");
        }

        //auditLogID = Logger.SaveException(ex);

        if (modelState != null)
        {
            modelState.AddModelError("", message);
        }
    }
}

Это мой взгляд.

@model MyApp.Model.User

@{
    ViewBag.Title = "User";
    Layout = "~/Views/Shared/_LayoutEmpty.cshtml";
}

<div>
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()

        <div class="msg">
            <div class="@(Html.ViewData.ModelState.IsValid ? "validation-summary-valid" : "validation-summary-errors") msg-pnl"
             data-valmsg-summary="true">
                <div class="msg-body">
                    <div class="text-danger">
                        The following error(s) occurred:
                        <ul class="validation-error">
                            @foreach (var modelError in Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
                            {
                                <li>@modelError.ErrorMessage</li>
                            }
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div>
            <div>
                @Html.LabelFor(model => model.Name, "User Name:", new { @class = "m-0 p-0" })
            </div>
            <div>
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control-required" } })
            </div>
            <div>
                @Html.ValidationMessageFor(model => model.Name, "*", new { @class = "text-danger" })
            </div>
        </div>

        <div>
            <div>
                @Html.LabelFor(model => model.Address, "Address :", new { @class = "m-0 p-0" })
            </div>
            <div>
                @Html.EditorFor(model => model.Address, new { htmlAttributes = new { @class = "form-control-required" } })
            </div>
            <div>
                @Html.ValidationMessageFor(model => model.Address, "*", new { @class = "text-danger" })
            </div>
        </div>

        <div>
            <div >
            <input type="submit" value="Save" class="btn-submit" id="btnSave" />
            </div>
        </div>
    }
</div>

Это контроллер

public class UserController : BaseController
{

    public ActionResult User()
    {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult User(User model)
    {
        //Doing some db call that may throw error
        throw new Exception("test exception");
        return View(model);
    }
}

1 Ответ

0 голосов
/ 21 мая 2018

Вы должны добавить атрибут фильтра исключений в метод контроллера.

[AutoExceptionHandler]
public ActionResult User(User model)
{
    //Doing some db call that may throw error
    throw new Exception("test exception");
    return View(model);
}

Посмотрите на этой странице, как создать и использовать атрибуты фильтра: https://www.c -sharpcorner.com /article / create-определенные пользователем фильтры-in-asp-net-mvc-5-in-step-by-step-process /

Также убедитесь, что вы передаете данные в представление взапрос, в противном случае при определенных настройках (где исключение не возвращается к представлению пользователя и страницы ошибок не настроены), вы можете получить пустую страницу.

Надеюсь, это поможет.

...