Asp.net mvc - الوصول إلى نموذج العرض من مرشح إجراء مخصص
-
22-08-2019 - |
سؤال
أحاول الوصول إلى بيانات النموذج التي تم تمريرها إلى العرض في عامل تصفية الإجراء 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);
}
}