MVC DataAnnotations ValidationAttribute

רוזוליה

משתמש מקצוען
הנדסת תוכנה
פרויקט WEB API .Net 6
אני צריכה לבנות ולידציה שתבדוק שדות חובה רק כאשר מגיעים מ action מסוים
לכן אין אפשרות להשתמש ב [Required] הסטנדרטי

יצרתי ולידציה חדשה היורשת מ RequiredAttribute
ואני צריכה לממש את הפונקציה IsValid
הייתי רוצה לקבל route data ולבדוק אם נמצאים ב action שבו נדרשת בדיקת שדה חובה

אשמח למידע על דרך לקבל route date בפונקציה IsValid
 

Yehuda Kremer

משתמש פעיל
הנדסת תוכנה
D I G I T A L
אפשר להשתמש בFilter.

לדוגמה, הגדרת filter:
C#:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplicationFilter.Filters
{
    public class CustomRequiredFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Do something before the action executes.

            var myRequiredData = context.ActionArguments
                .Where(arg => arg.Key == "myData").FirstOrDefault().Value?.ToString();

            if (string.IsNullOrWhiteSpace(myRequiredData))
            {
                context.Result = new BadRequestObjectResult("myData is required");
                return;
            }

            if (!context.ModelState.IsValid)
            {
                context.Result = new UnprocessableEntityObjectResult(context.ModelState);
            }
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Do something after the action executes.
        }
    }
}
רישום הfilter:
C#:
builder.Services.AddScoped<CustomRequiredFilter>();
שימוש בfilter:
C#:
        [ServiceFilter(typeof(CustomRequiredFilter))]
        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get(string? myData)
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
 

רוזוליה

משתמש מקצוען
הנדסת תוכנה
אפשר להשתמש בFilter.
לא כ"כ הבנתי איך ה filter עוזר.
הצורך הוא במודל עם ולידציות.
יש ולידציות קבועות שבודקות את תקינות הקלט, הן אמורות להתבצע בכל מצב.
לעומת זאת, יש ולידציות לשדות חובה שאמורות להיות מופעלות רק מתוך action מסוים.

האם הקוד בודק ModelState.IsValid בכל מצב?
תודה
 

Yehuda Kremer

משתמש פעיל
הנדסת תוכנה
D I G I T A L
אני חושב שfilter הוא פתרון יותר "נכון" במקרה הספציפי,
משום שנכון יותר להכניס וולידציה שקשורה לactions מסוימים, ברמת הaction באמצעות filter.
מאשר ברמת המודל (אם בכלל אפשרי..)
 

רוזוליה

משתמש מקצוען
הנדסת תוכנה
אני חושב שfilter הוא פתרון יותר "נכון" במקרה הספציפי,
משום שנכון יותר להכניס וולידציה שקשורה לactions מסוימים, ברמת הaction באמצעות filter.
מאשר ברמת המודל (אם בכלל אפשרי..)
כלומר לכתוב ידנית את הבדיקה של כל שדה?

הפתרון העקיף שמצאתי בינתיים הוא שימוש ב RequiredIf
כאשר השדה הוא חובה בתנאי שמשתנה בוליאני הוא true,
לכן הוספתי למודל שדה בוליאני והוא מקבל ערך true ב action הספציפי.
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קכו

א שִׁיר הַמַּעֲלוֹת בְּשׁוּב יְהוָה אֶת שִׁיבַת צִיּוֹן הָיִינוּ כְּחֹלְמִים:ב אָז יִמָּלֵא שְׂחוֹק פִּינוּ וּלְשׁוֹנֵנוּ רִנָּה אָז יֹאמְרוּ בַגּוֹיִם הִגְדִּיל יְהוָה לַעֲשׂוֹת עִם אֵלֶּה:ג הִגְדִּיל יְהוָה לַעֲשׂוֹת עִמָּנוּ הָיִינוּ שְׂמֵחִים:ד שׁוּבָה יְהוָה אֶת (שבותנו) שְׁבִיתֵנוּ כַּאֲפִיקִים בַּנֶּגֶב:ה הַזֹּרְעִים בְּדִמְעָה בְּרִנָּה יִקְצֹרוּ:ו הָלוֹךְ יֵלֵךְ וּבָכֹה נֹשֵׂא מֶשֶׁךְ הַזָּרַע בֹּא יָבוֹא בְרִנָּה נֹשֵׂא אֲלֻמֹּתָיו:
נקרא  13  פעמים

לוח מודעות

למעלה