Asp.net mvc - الوصول إلى نموذج العرض من مرشح إجراء مخصص

StackOverflow https://stackoverflow.com/questions/872796

سؤال

أحاول الوصول إلى بيانات النموذج التي تم تمريرها إلى العرض في عامل تصفية الإجراء OnActionExecuted.هل يعرف أحد إن كان هذا ممكنا؟

أحاول أن أفعل شيئًا مثل هذا:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    //get model data
    //...

    sitemap.SetCurrentNode(model.Name);
}

اي نصيحه؟

هل كانت مفيدة؟

المحلول

وهذا النموذج هو ما يلي:

filterContext.Controller.ViewData.Model

نصائح أخرى

وأنا لا أعرف لماذا ولكن filterContext.Controller.ViewData.Model فارغ دائما حتى عندما يتم تنفيذ ربط نموذج قبل OnActionExecuted. لقد وجدت الحل باستخدام الحدث OnModelUpdated لوضع تلك الممتلكات من قبل.

ولدي الموثق نموذج:

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

وبعد ذلك تحتاج إلى تعيين الموثق الافتراضي الخاص بك الموثق نموذج جديد في قسم Application_Start() في Global.asax:

ModelBinders.Binders.DefaultBinder = new CustomModelBinder();

وأخيرا يمكنك الوصول Model الخاصة بك في ActionFilterAttribute:

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

في صافي الأساسية لديك ActionArguments IDictionary على السياق، مع جميع المعلمات من طريقتك

وحتى إذا كان لديك طريقة تحكم التالي

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

ويمكنك الوصول إلى الحقل مثل ذلك

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

وجعل base.OnActionExecuted() استدعاء السطر الأخير من طريقة حل المشكلة "نموذج كونها فارغة" بالنسبة لي.

(وهذا هو تعليق على الجوابSteven ليون الصورة، ولكن أنا نشر كإجابة لأنني لا أستطيع التعليق).

إذا كنت تحصل على قيمة فارغة - كبديل لإجابة @Gustavo Clemente، يمكنك محاولة التجاوز OnActionExecuted وتمرير viewModel الخاص بك إلى العرض بالطريقة التالية:

فعل:

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

يصف:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top