A pris une route différente. J'aurais pu simplement créer une variable dans le basecontroller et la mettre à true dans n'importe quelle action. Mais je voulais utiliser un attribut, juste plus facile à comprendre le code. Fondamentalement dans le basecontroller j'ai eu le code qui verrouillerait la page dans certaines conditions, vue seulement. Mais étant dans la classe de base cela affecterait chaque page, il y avait quelques actions dont j'avais besoin pour être éditées.
J'ai ajouté une propriété au basecontroller. Et dans le OnActionExecuting de l'attribut, je suis en mesure d'obtenir le contrôleur en cours et le définir la propriété à true.
De cette façon, j'ai été en mesure d'obtenir mon paramètre d'attribut dans mon override de ViewResult.
Mon Attribute
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class DoNotLockPageAttribute : ActionFilterAttribute
{
private readonly bool _doNotLockPage = true;
public DoNotLockPageAttribute(bool doNotLockPage)
{
_doNotLockPage = doNotLockPage;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var c = ((BaseController)filterContext.Controller).DoNotLockPage = _doNotLockPage;
}
}
Mon contrôleur de base
public class BaseController : Controller
{
public bool DoNotLockPage { get; set; } //used in the DoNotLock Attribute
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{ ...... }
protected override ViewResult View(string viewName, string masterName, object model)
{
var m = model;
if (model is BaseViewModel)
{
if (!this.DoNotLockPage)
{
m = ((BaseViewModel)model).ViewMode = WebEnums.ViewMode.View;
}
....
return base.View(viewName, masterName, model);
}
}
}