پیش از آنکه بخواهیم کلاس کنترل گر را بنویسید، بهتر است تا با فایل های نما آشنا شوید، زیرا آنها بخشی از برنامه هستند که با کار در تعامل بوده و داده ها را دریافت و یا نمایش می دهد. کنترل گر میانجی میان نما و مدل هستند به گونه ای که آنها با مدل ارتباط داشته و مقدارهای برگشتی را دریافت و سپس آنها را به کمک Action Method به فایل نما می فرستند.

همه فایل های نما که دارای پسوند chtml هستند در زیر پوشه Views نگهداری می شوند. در شکل زیر می بینید که یک زیر دایرکتوری به نام Home در زیر پوشه Views هست که همه فایل های نما وابسته به کنترل گر HomeController را در خود نگه می دارد. در نوشته مفهوم کنترل گر در ASP.NET Core MVC گفتیم که اگر به متد ()View هیچ ورودی فرتساده نشود، یک فایل نما همنام با Action Method فراخوان می شود و می بینید که این فایل برای HomeController از مسیر Views/Home فراخوانی خواهد شد. بنابراین اگر کنترل گر دیگری به نام LoginController داشته باشیم، پس یک زیر پوشه به نام Login در زیر Views باید باشد که همه فایل های نما این کنترل گر را در خود نگه می دارد.

فایل های نما

هر فایل نما از عبارت های سی شارپ و HTML ساخته می شود تا بتوانیم واسط کاربری را بسازیم. برای نمونه یک فایل نمتا تنها می تواند دربرگیرنده کدهای HTML برای نمایش یک فرم ثبت نام باشد، در این مورد، داده های ورودی از فرم در یک Action Method از کلاس منترل گر دریافت شده و سپس بررسی مو در پایان با یک مدل ارتباط برقرار شده تا داده ها در جدول درج شوند.

در کاربردی دیگر می خواهیم جدول HTML از داده ها را نمایش دهیم،پس کنترل گر با مدل هم کنشی (تعامل) داشته و داده های جدول پایگاه داده را دریافت کرده و سپس این داده های شاید پیش پردازش شده را به فایل نما می فرستند تا در پایان به کاربر در جدول HTML، نشان داده شوند. بنابراین می توان از متد کنترل گر، یک یا چندین داده را به فایل نما بفرستیم تا در آنجا با کدهای HTML برای نمایش به کاربر آماده شوند.

شکل زیر یک نمونه از فایل نما را نشان می دهد و می بینید که از کدهای HTML و عبارت های سی شارپ ساخته شده اند. در شکل بخش هایی نشان داده شده اند که بخشی از Razor View Engine یا موتور نما Razor هستند که درباره آنها در نوشته های پیش رو خواهیم گفت ولی در این نوشته درباره ViewData و یک عبارت Razor دیگر به ViewBag خواهیم گفت که آنها برای فرستادن داده به نما به کار گرفته می شوند.

همانگونه که می بینید عبارت های سی شارپ Razor با کاراکتر @ آغاز می شوند. به طور کلی می توان یک مقدار را با عبارت Razor در میان کدهای HTML یا اینکه برآیند (نتیجه) انجام یک تابع را در میان کدهای HTML نشاند. در نخستین عبارت Razor که ViewData نام دارد، مقدار یک متغیر به نام Title که از متد کنترل گر به فایل نما فرستاده شده است را میان تگ <title> نمایش می دهیم. به گفته دیگر کد زیر بدین مفهوم است که نخست یک مقدار این متغیر در عنوان مرورگر چاپ شده و سپس یک کاراکتر – و در پایان رشته AspNetCoreMVCBasic نماش داده شود. بنابراین دو مقدار پویا به کمک متد کنترل گر و عبارت Razor و یک مقدار ثابت ایستا نمایش داده می شوند.

AspNetCoreMVCBasic نام پروژه من هست.

فرستادن داده از کنترل گر به نما

در ساده ترین شیوه، شما یک متغیر ساده مانند رشته یا شماره در متدی از کلاس کنترل گر می نویسید و سپس آن را به نما می فرستید تا به کار نمایش داده شود ولی شیوه پیچیده تر این است که داده هایی را از جدول یا جدول هایی از پایگاه داده بخوانید و سپس آنها را به نما بفرستید. برای نمونه شما سایتی دارید که کالاهایی را به فروش می رسانید و یک متد کنترل گر به نام ()ShowProduct دارید که شناسه یک کالا را دریافت کرده و سپس با آن شناسه در جدول جستجو و مشخصات آن کالا را واکشی کرده و در پایان به یک نما همنام با نام متد می فرستد. در اینجا الگو مسیر به گونه زیر است:

در اینجا Id شناسه کالا و بایسته (اجباری) است، از این رو این شماره که از نشانی URL فرستاده می شود، ورودی متد ()ShowProduct از کلاس کنترل گر Product است. با این شماره سپس یک پرس و جو (کوئری) Entity Framework آماده شده و در جدول (یا جدول های وابسته) پایگاه داده جستجو می شود. در اینجا باید یادآوری کنیم که می توانیم از نشانی URL داده به سرور بفرستیم.

شیوه های فرستادن داده از متد کنترل گر به نما

در خط ۶ از شکل بالا عبارت [“ViewData[“Title@ نوشته شده و بدین مفهوم است که می خواهیم مقدار یک متغیر آماده و فرستاده شده از متذ کنترل گر را نمایش دهیم. اکنون پروژه را اجرا و خروجی را در مرورگر تماشا کنید و خواهید دید که رشته Home Page جایگزین [“ViewData[“Title@ می شود زیرا ما در جایی مقدار Home Page را به آن داده ایم. ولی کجاها می توان عبارت ViewData را برای شناساندن (تعریف کردن) یک متغیر و مقدار آن به کار برد:

  • در بالا و آغاز یک فایل و پیش از کدهای HTML
  • درون یک متد کنترل گر

در اینجا باید به شما بگوییم که شکل آغاز نوشته برای یک فایل لایه در ASP.NET Core MVC است که در نوشته پیش رو درباره فایل لایه در نماها خواهیم گفت. فایل های لایه، فایل های نمایی با پسوند chtml هستند که پایه ای برای دیگر فایل های نما هستند، بدین مفهوم که یک بار کدهای تکراری نماها ها در یک فایل لایه می نوسیم و سپس در فایل های نما، این فایل لایه را پیوست کرده و بخش های ویژخه آن فایل را نما را می نویسیم.

شیوه نخست ViewData

در بالا تا اندازه با ViewData آشنا شدید و آن در کنار ViewBag دو روش همسان برای فرستادن داده از متذ کنترل گر به فایل نما هستند. الگوی زیر چگونگی به کاربردن عبارت های سی شارپ Razor را برای نمایش یک مقدار در یک فایل نما نشان می دهد. همانگونه که گفتیم عبارت های سی شارپ در فایل نما با @ آغاز می شوند. در کد زیر به جای VariableName نام متغیری جایگزین می شود که شما می خواهید مقدار آن نمایش داده شود.

ساخت یک متد کنترل گر و یک فایل نما

در کد زیر می خواهیم نخست یک متد کنترل گر به نام ()About را به کلاس HomeController بی افزاییم که در آن دو متغیر به نام های name و age می نویسیم و سپس به شما نشان می دهیم چگونه در متد این متغیرها را بدست ViewData برای فرستاده شدن به نما آماده کنیم. همچنین نیاز به یک فایل نما به نام About.chtml در مسیر Views/Home داریم که در آن درون مایه (محتوای) دو متغیر را نشان می دهیم.

کد زیر متد ()About را نشان می دهد که هیچ پارامتر ورودی را دریافت نمی کند پس با الگوی مسیر Home/Abuot/ یا از نشانی https://localhost:5001/home/about فراخوانی می شود. زمانی که این متد فراخوانی شود، دو متغیر به ترتیب رشته ای و شماره صحیح به نام های name و age ساخته شده و سپس مقدار این متغیرها به ViewData داده می شوند.

توجه کنید که ViewData یک Collection است که می توانیم کلیدهایی را بشناسانیم (تعریف کنیم) که نام این کلیدها همان نام متغیرهایی است که می خواهیم در نما نمایش دهیم. بنابراین در اینجا مقدار متغیر name در متد به کمک کلید Name در ViewData در فایل نما نشان داده می شود. از این رو از ViewData برای فرستادن و نمایش مقدارها کمک گرفته می شود. بازهم تاکید می کنیم که در فایل نما عبارت های سی شارپ با کاراکتر @ آغاز می شوند.

اکنون دو کد زیر را درون فایل About.cshtml وارد و سپس پروژه را اجرا کنید تا ببینید که مقدار متغیرهای name و age به کمک کلیدهای Name و Age در فایل نما نشان داده می شوند که در واقع اکنون خودشان متغیرهای جدایی هستند. توجه کنید که می توانیم یک رشته ایستا مانند Name و Age را در کنار رشته های پویای ViewData در میان تگ های HTML بنشانیم. شکل زیر خروجی این فایل نما را نشان می دهد.

اکنون کد بالا را به گونه زیر تغییر دهید که در بالای آن یک عبارت {}@ افزوده ایم که در میان آکولادها می توانیم یک تا چندین عبارت سی شارپ را بنویسیم. به گفته دیگر می توانیم در آغاز یک فایل نما چندین عبارت سی شارپ را میان {}@ بنویسیم، به جای آنکه تک تک هر عبارت سی شارپ را با @ در آغاز آنها بنویسیم. همچنین توجه کنید در پایان هر عبارت سی شارپ درون {}@ نویسه (کاراکتر) سمی کالن ; گذاشته شده است. اکنون پروژه را اجرا کنید تا شکل خروجی زیر نشان داده شود. چرایی (دلیل) نا همسانی این دو شکل خروجی در این است که در دومین کد فایل نما که در زیر نوشته ایم، آشکار با عبارت ;Layout=null گفته ایم که نمی خواهیم لایه پیش فرض به کار گرفته شود. در این باره در نوشته پیش رو گفته ایم.

شیوه دوم ViewBag

ViewBag یکی دیگر از روش های فرستادن و نمایش داده ها است که کاربردی همانند ViewData دارد. ViewData ابزاری است که دوتایی های Key=Value را برای فرستادن داده به کار می برد و از این رو ViewData یک دیکشنری است که دوتایی های Key=Value را در خود نگه می دارد. در برابر این، ViewBag از ویژگی های پویا (Dynamic Properties) برای شناساندن (تعریف کردن) و فرستادن و نمایش دادن داده ها کمک می گیرد.

در کد زیر متد ()About را باز نویسی کرده ایم به گونه ای که یک ورودی id از گونه string را دریافت می کند. بنابراین با توجه به این تک ورودی، الگو مسیر Home/About/id مانند Home/About/1 یا Home/About/10023 خواهد بود. در کد بررسی می شود که آیا ورودی برابر با یکی از مقدارهای 1 یا 2 هست یا نه، اگر باشد، پس به کمک ViewBag دو ویژگی به نام Name و Age مقدار دهی می شوند. ولی اگر شماره ای برای id در نشانی فرستاده نشود یا شماره چیزی جز شمارهای 1 و 2 باشد، پس مقدارهای Unknown User برای ویزگی های Age و Name انتساب داده می شود.

اکنون باید فایل نما About.cshtml را با توجه به کدهای زیر تغییر دهید. همانگونه که می بینید برای چاپ مقدارهای ویژگی های Name و Age عبارت های ViewBag.Name@ و ViewBag.Age@ را به کار برده ایم.

دریافت ورودی ها برای متدهای کنترلگر از نشانی URL

با توجه به متد ()About بالا که تک ورودی id دارد، نشانی URL می تواند برای نمونه به گونه https://localhost:5001/home/about/1 باشد. در واقع آن شماره پس از home/about در نشانی URL، همان ورودی متد ()About خواهد بود. اکنون گمان کنید که متد ()About سه ورودی id و name و age را برای یک کاربر دریافت می کند و سپس این ورودی ها را به کمک کوئری Entity Framework به یک پایگاه داده می فرستد تا در جدولی درج شود. بنابراین بازهم تاکید می کنیم که

  • کنترل گر میانجی میان نما و مدل است.
  • همانند این نمونه می توان به کمک نشانی URL داده هایی را به کنترل گر فرستاد.
  • یکی دیگر از داده هایی که از نشانی به کنترل گر می فرستیم، رشته های کوئری هستند که به کمک HttpContext.Request.Query مقدار هر کلید کوئری را می توانیم بدست آوریم.
  • همیشه نیازی نیست تا چیزی به کاربر بدست کنترل گر نشان داده شود، بلکه می توان تنها پرس و جویی به پایگاه داده آماده کنیم.
  • هرگاه که شما در نشانی URL الگوی مسیری از پیش آماده شده در برنامه را آماده می کنید، یکی کنترل گر و یکی از متدهای آن فراخوانی می شود که اگر این متد ورودی یا چندین ورودی داشته باشد، به ترتیب پس از ControllerName/ActionMethodName فهرست می شوند.

بنابراین اگر گمان کنیم که متد ()About سه ورودی دریافت می کند، پس نشانی URL باید به گونه زیر باشد که در آن به ترتیب از چپ به راست ورودی در متد، هر ورودی با یک / از دیگری در نشانی URL نوشته می شود. توجه کنید ورودی هایی که از نشانی به پارمترهای متد فرستاده می شوند، رشته هستند، پس شاید نیاز باشد تا یک تبدیل گونه (Type Casting) را در خود متد پیش از به کار گیری مقدارهای فرستاده شده، انجام دهیم.

در کد زیر می خواهیم مقدارهای ورودی برای پارامترهای id و age را از رشته به شماره صحیح تبدیل گونه دهیم. توجه کنید مقدار این دو پارامتر در ذات باید شماره باشد ولی چون ورودی از نشانی به متد همیشه رشته است، پس درون متد به کمک ()Int32.Parse، آنها را از رشته به شماره صحیح تبدیل می کنیم.