2009-05-16 19 views

cevap

51

modeli yer almaktadır. Daha önce bu özelliği ayarlamak için OnModelUpdated olayını kullanarak bir çözüm buldum.

ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); 

Son olarak erişebilirsiniz: Eğer Global.asax Application_Start() bölümünde yeni model bağlayıcı varsayılan bağlayıcı ayarlamanız gerekir Bundan sonra

public class CustomModelBinder: DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     controllerContext.Controller.ViewData.Model = bindingContext.Model; 
     base.OnModelUpdated(controllerContext, bindingContext); 
    } 
} 

:

manken bağlayıcı var senin ModelActionFilterAttribute bir in:

public class TraceLog : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     //filterContext.Controller.ViewData.Model now isn't null 
     base.OnActionExecuted(filterContext); 
    } 
} 
+8

her zaman boş :( – Korayem

+4

@Korayem - sen denemek ve erişim ne kadar erken bağlıdır. Denetleyici eylemi yürütüldükten sonra alırsanız, viewmodel'in bir örneği olmalıdır. – JBeckton

+8

Her yöntemde benim için boş bulunuyor (OnActionExecuting, OnActionExecuted, OnResultExecuting, OnResultExecuted) –

18

Nedenini bilmiyorum ama filterContext.Controller.ViewData.Model modeli bağlamak OnActionExecuted önce yürütülür bile her zaman null:

1

Eylem:

[Breadcrumb("Index")] 
public ActionResult UnitIndex() 
{ 
    View(new Answers()); 
} 

Özellik:

- Eğer null adlı alıyorsanızise @Gustavo Clemente'nın cevabı alternatif olarak size OnActionExecuted geçersiz kılma ve şu şekilde görünümüne içine ViewModel geçirmeden deneyebilirsiniz
public class BreadcrumbAttribute : ActionFilterAttribute 
{ 
    public string Page { get; set; } 

    public BreadcrumbAttribute(string page) 
    { 
     Page = page; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var model = (IBreadcrumbs)filterContext.Controller.ViewData.Model; 
     model.Breadcrumbs = BreadcrumbHelper.GetBreadCrumbs(string.Format("{0}", filterContext.RouteData.DataTokens["area"]), Page); 
    } 
} 

enter image description here

+0

Bu kod nereden geliyor? Garip bir şekilde, son bir projede özellikle bir kırıntıları çözümleme bağlamında bu soruya bir cevap arıyordum! –

+0

@CrescentFresh Bunu şirketlerden biri için yaptım .... –

2

Net Core üzerinde

Yani Çok

gibi sahada erişebilir

[HttpPost] 
    public void Post([FromBody]BaseRequest request) 
    { 
    } 

aşağıdaki denetleyici yöntemi varsa yönteminden tüm parametreleri ile, bağlam üzerinde ActionArguments IDictionary var

public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var request = context.ActionArguments["request"] as BaseRequest;` 
     //do whatever, 
    } 
İlgili konular