我知道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?还是我错了?最好的做法有更好的方法吗?
答案 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)
并让它使用您的自定义命名视图,来自任何方法,基于当前正在执行的操作。