MVC DataAnnotations ValidationAttribute

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

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

אשמח למידע על דרך לקבל route date בפונקציה IsValid
 
  • הוסף לסימניות
  • #2
אפשר להשתמש ב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();
        }
 
  • הוסף לסימניות
  • #3
אפשר להשתמש בFilter.
לא כ"כ הבנתי איך ה filter עוזר.
הצורך הוא במודל עם ולידציות.
יש ולידציות קבועות שבודקות את תקינות הקלט, הן אמורות להתבצע בכל מצב.
לעומת זאת, יש ולידציות לשדות חובה שאמורות להיות מופעלות רק מתוך action מסוים.

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

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

פרוגבוט

תוכן שיווקי
פרסומת

הצטרפות לניוזלטר

איזה כיף שהצטרפתם לניוזלטר שלנו!

מעכשיו, תהיו הראשונים לקבל את כל העדכונים, החדשות, ההפתעות בלעדיות, והתכנים הכי חמים שלנו בפרוג!

לוח מודעות

הפרק היומי

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


תהילים פרק כה

אלְדָוִד אֵלֶיךָ יי נַפְשִׁי אֶשָּׂא:באֱלֹהַי בְּךָ בָטַחְתִּי אַל אֵבוֹשָׁה אַל יַעַלְצוּ אֹיְבַי לִי:גגַּם כָּל קוֶֹיךָ לֹא יֵבֹשׁוּ יֵבֹשׁוּ הַבּוֹגְדִים רֵיקָם:דדְּרָכֶיךָ יי הוֹדִיעֵנִי אֹרְחוֹתֶיךָ לַמְּדֵנִי:ההַדְרִיכֵנִי בַאֲמִתֶּךָ וְלַמְּדֵנִי כִּי אַתָּה אֱלֹהֵי יִשְׁעִי אוֹתְךָ קִוִּיתִי כָּל הַיּוֹם:וזְכֹר רַחֲמֶיךָ יי וַחֲסָדֶיךָ כִּי מֵעוֹלָם הֵמָּה:זחַטֹּאות נְעוּרַי וּפְשָׁעַי אַל תִּזְכֹּר כְּחַסְדְּךָ זְכָר לִי אַתָּה לְמַעַן טוּבְךָ יי:חטוֹב וְיָשָׁר יי עַל כֵּן יוֹרֶה חַטָּאִים בַּדָּרֶךְ:טיַדְרֵךְ עֲנָוִים בַּמִּשְׁפָּט וִילַמֵּד עֲנָוִים דַּרְכּוֹ:יכָּל אָרְחוֹת יי חֶסֶד וֶאֱמֶת לְנֹצְרֵי בְרִיתוֹ וְעֵדֹתָיו:יאלְמַעַן שִׁמְךָ יי וְסָלַחְתָּ לַעֲוֹנִי כִּי רַב הוּא:יבמִי זֶה הָאִישׁ יְרֵא יי יוֹרֶנּוּ בְּדֶרֶךְ יִבְחָר:יגנַפְשׁוֹ בְּטוֹב תָּלִין וְזַרְעוֹ יִירַשׁ אָרֶץ:ידסוֹד יי לִירֵאָיו וּבְרִיתוֹ לְהוֹדִיעָם:טועֵינַי תָּמִיד אֶל יי כִּי הוּא יוֹצִיא מֵרֶשֶׁת רַגְלָי:טזפְּנֵה אֵלַי וְחָנֵּנִי כִּי יָחִיד וְעָנִי אָנִי:יזצָרוֹת לְבָבִי הִרְחִיבוּ מִמְּצוּקוֹתַי הוֹצִיאֵנִי:יחרְאֵה עָנְיִי וַעֲמָלִי וְשָׂא לְכָל חַטֹּאותָי:יטרְאֵה אוֹיְבַי כִּי רָבּוּ וְשִׂנְאַת חָמָס שְׂנֵאוּנִי:כשָׁמְרָה נַפְשִׁי וְהַצִּילֵנִי אַל אֵבוֹשׁ כִּי חָסִיתִי בָךְ:כאתֹּם וָיֹשֶׁר יִצְּרוּנִי כִּי קִוִּיתִיךָ:כבפְּדֵה אֱלֹהִים אֶת יִשְׂרָאֵל מִכֹּל צָרוֹתָיו:
נקרא  2  פעמים
למעלה