当Viewname和Action名称不同时,Mvc OnException

时间:2016-02-14 11:00:48

标签: asp.net-mvc error-handling exception-handling

我知道MVC上有一些类型的处理异常。我选择创建一个基本控制器并覆盖OnException方法。一切都很好,但在我的一个控制器中,我的帖子操作名称与视图名称不同,如下所示

[HttpPost]
public ActionResult Kaydet(PersonelModel model)
    {
        var personel = new Personel();
        SimpleMapper.PropertyMap(model,personel);
        _personelService.Ekle(personel);

        model.Id = personel.Id;
        model.UyariBilgisi.BildirimTipi=BildirimTipi.Bilgi;
        model.UyariBilgisi.UyariMetni = "Kayıt başarıyla eklendi.";
        return View("PersonelDetay", model);
    }

视图名称是PersonelDetay。 这是我的OnException方法

 protected override void OnException(ExceptionContext filterContext)
    {
        Exception exception = filterContext.Exception;

        if (exception is NotificationException)
        {

            ViewModelBase viewModelBase = new ViewModelBase()
            {
                UyariBilgisi = new UyariBilgisi() { UyariMetni = exception.Message, BildirimTipi = BildirimTipi.Uyari }
            };

            filterContext.Result = View(viewModelBase);

            filterContext.ExceptionHandled = true;
        }
    }

当Kaydet方法获得通知异常时OnException方法起作用并尝试返回" Kaydet"查看,但没有名为" Kaydet"

的视图

为了解决这个问题,我在OnException事件中使用了视图名称。我如何获得viewname?还是我错了?最好的做法有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

你可以试试这个......

在你的控制器中添加成员变量Dictionary<string, string> _viewNames,然后在你的构造函数中使用操作名称作为键来初始化集合,并使用视图的名称作为值:

_viewNames = new Dictionary<string, string> 
{
    { "Kaydet", "PersonelDetay" }
}

然后创建一个方法,返回当前操作的视图名称:

private string GetViewName() 
{
    return _viewNames[this.ControllerContext.RouteData.Values["action"].ToString()];
}

将操作中的return语句更改为:

return View(GetViewName(), model)

并在OnException中将filterContext.Result替换为:

filterContext.Result = View(GetViewName(), viewModelBase);

现在由于多种原因,这并不理想,例如:返回不同视图的操作,在初始化集合等时必须反映操作名称更改,但它可能对您当前的情况有用。

如果有办法向MVC注册不同的视图名称而不是将其传递到View方法,那么您可以OnException只需调用View(viewModelBase)并让它使用您的自定义命名视图,来自任何方法,基于当前正在执行的操作。