ASP.NET مفك + فلونتفاليداتيون + بارتيالفيو > لا التحقق من جانب العميل

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

سؤال

يمكنني استخدام فلونتفاليداتيون للتحقق من صحة بلدي ASP.NET مفك 5.1 فيوموديلز (باستخدام التحقق الافتراضي غير مزعجة من جانب العميل).أنا تسجيل / إنشاء بلدي المصادقون عبر نينجيكت (لا سمات على فيوموديلز):

FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new NinjectValidatorFactory(_kernel));
AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach(match => _kernel.Bind(match.InterfaceType).To(match.ValidatorType));

لدي وجهة نظر جزئية التي يتم استخدامها في كثير من الأحيان في جميع أنحاء التطبيق.هذا العرض الجزئي له عرض خاص بهنموذج.و فيوموديل " الرئيسي "(واحد للعرض بأكمله) يرث فقط من هذا فيوموديل" جزئي".

public class IndexViewModel : PersonalInfoViewModel { ... }

يتم استخدام نفس النمط على المدققين:

public class IndexValidator : PersonalInfoValidator { ... }

يعمل هذا بشكل جيد ويعمل التحقق من جانب الخادم بالإضافة إلى التحقق من جانب العميل في العرض "الرئيسي".ولكن لا يتم تشغيل التحقق من جانب العميل على العرض الجزئي (لا data-val-* على حقول الإدخال هناك).

وجهة نظري "الرئيسية" Index.cshtml

@model IndexViewModel
@Html.TextBoxFor(x => x.SomeProperty) // client-side validation works fine

@Html.Partial("PersonalInfo") // client-side validation in the partial view does not work (see below)

وجهة نظري الجزئية PersonalInfo.cshtml:

@model PersonalInfoViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation does not work

لقد لاحظت أنه يعمل عند تغيير نموذج للعرض الجزئي إلى فيوموديل " الرئيسي:

@model IndexViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation works

لذلك أعتقد في مكان ما عند بناء التحقق من جانب العميل لا يتم التقاط المدقق الصحيح ولا data-val-* يتم حقن السمات في هتمل.ولكن لا أستطيع تغيير فيوموديل على وجهة نظر جزئية ، لأنه يستخدم على عدة صفحات مختلفة مع وجهات نظر "الرئيسية" مختلفة (كل وراثة من بيرسونالينفوفيوموديل على الرغم من).

أي أفكار حول كيفية الحصول على بلدي التحقق من جانب العميل العمل في هذه الحالة?

تحديث

بعد بضع ساعات من الحفر من خلال ASP.NET مصدر ويبستاك ، وجدت أن المشكلة يبدو أن تحدث في TextBoxFor الطريقة.هناك ModelMetaData يتم إنشاؤه من النموذج-وهناك في مكان ما يبدأ في استخدام IndexViewModel بدلا من PersonalInfoViewModel للحصول على البيانات الوصفية للتحقق من جانب العميل:

ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Html.GetUnobtrusiveValidationAttributes("FirstName", metadata); // no client-side validation attributes found

ولكن هذا يولد سمات التحقق الصحيحة من جانب العميل إذا لم أحدد البيانات الوصفية بشكل صريح:

Html.GetUnobtrusiveValidationAttributes("FirstName");

لسوء الحظ ، لم أجد طريقة لاستخدام هذه المعرفة لمصلحتي حتى الآن.

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

المحلول

لم أكن قادرا على إيجاد حل لطيف لمشكلتي ، ولم أكن أريد أن ألعب مع ASP.NET مصدر ويبستاك بعد الآن ، لذلك أنا استقر مع الحل القبيح:

أنا" يدويا " حقن المفقودين data-val-* السمات عند عرض حقول الإدخال ، مثل هذا:

@Html.TextBoxFor(x => x.FirstName, Html.GetUnobtrusiveValidationAttributes("FirstName"))

منذ GetUnobtrusiveValidationAttributes (تسمى قائمة بذاتها) يبني سمات هتمل الصحيحة أنا فقط تأخذ منهم وإضافته إلى مربع النص.بالتأكيد ليست جميلة ، لكنها تعمل ويمكنني الاستمرار في عملي.إذا كان شخص ما لديه حل أفضل ، سأكون سعيدا جدا لسماع ذلك.

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