এই লেকচারে ASP.NET Core-এর Routing সিস্টেমে Optional Parameters নিয়ে আলোচনা করা হয়েছে। আগের লেকচারে আমরা দেখেছি কীভাবে Default Value সেট করতে হয়। এবার চলো দেখি, ইউজার কোনো Parameter না দিলে কীভাবে তাকে null হিসেবে হ্যান্ডেল করা যায়।
১. বিস্তারিত বিশ্লেষণ (Comprehensive Breakdown)
সমস্যা: Parameter-এ Default Value না দিয়ে Null সেট করা
কখনো কখনো আমাদের এমন Requirement থাকে যে, ইউজার যদি কোনো ID বা Parameter না দেয়, তাহলে আমরা কোনো Default Value (যেমন: ১ বা ২) বসাতে চাই না। বরং আমরা চাই অ্যাপটি বুঝে নিক যে কোনো ভ্যালু দেওয়া হয়নি (অর্থাৎ ভ্যালুটি null) এবং সেই অনুযায়ী আলাদা কোনো Response জেনারেট করুক।
Routing-এ সরাসরি {id=null} লিখলে তা কাজ করে না।
সমাধান: Optional Parameter তৈরি করা
এর সমাধান হলো Optional Parameter ব্যবহার করা। কোনো Parameter-এর নামের শেষে একটি প্রশ্নবোধক চিহ্ন (?) দিলে সেটি Optional Parameter হয়ে যায়।
- Syntax:
{parameterName?}(যেমন:{id?}) - ফলাফল: ইউজার যদি URL-এ এই ভ্যালুটি না দেয়, তাহলে Route-টি ঠিকই ম্যাচ করবে, কিন্তু
Request.RouteValues-এ সেই Parameter-এর ভ্যালু হিসেবেnullসেট হবে।
Technical Pitfalls (Convert.ToInt32 এর সমস্যা) লেকচারে একটি গুরুত্বপূর্ণ বিষয়ের দিকে নজর দেওয়া হয়েছে:
- যেহেতু ভ্যালু না দিলে তা
nullহয়, তাই আমরা যখনConvert.ToInt32(null)ব্যবহার করে একে Integer-এ কনভার্ট করার চেষ্টা করি, তখন এটি কোনো Error না দিয়ে ডিফল্টভাবে0(Zero) রিটার্ন করে। - এটি চেক করার জন্য ইন্সট্রাক্টর Visual Studio-এর Immediate Window ব্যবহার করে
context.Request.RouteValues["id"]এর আউটপুট ম্যানুয়ালি চেক করার পরামর্শ দিয়েছেন, যা সরাসরিnullদেখায়। - ডেটা টাইপ String হোক বা Number, Optional Parameter-এর ক্ষেত্রে ভ্যালু না দিলে তা সবসময়
nullহবে।
সঠিকভাবে Handle করার উপায় (ContainsKey)
যেহেতু null কে কনভার্ট করলে 0 হয়ে যাওয়ার একটা ঝুঁকি থাকে, তাই সবচেয়ে ভালো উপায় হলো ভ্যালুটি আদৌ সাপ্লাই করা হয়েছে কি না, তা চেক করা।
- এজন্য
Request.RouteValues.ContainsKey("id")মেথড ব্যবহার করা হয়। - এটি চেক করে যে URL-এ
idনামক কোনো Parameter এসেছে কি না। - যদি আসে (True): আমরা ভ্যালু রিট্রিভ করে আউটপুট দেখাব।
- যদি না আসে (False): আমরা অন্য একটি Response দেখাব (যেমন: “ID is not supplied”)।
Real-world Use Case
বাস্তব প্রোজেক্টে এর ব্যবহার খুব প্রাসঙ্গিক। যেমন: যদি কোনো ID সাপ্লাই করা না হয় (অর্থাৎ null), তাহলে তুমি Database থেকে খামোখা ডেটা রিট্রিভ করার জন্য Query চালাবে না, বরং সরাসরি ইউজারকে একটি মেসেজ বা ডিফল্ট লিস্ট দেখিয়ে দেবে।
Code Implementation ট্রান্সক্রিপ্টে যে লজিকগুলো আলোচনা করা হয়েছে, তার C# ইমপ্লিমেন্টেশন নিচে দেওয়া হলো:
app.UseEndpoints(endpoints =>
{
// id parameter-কে optional (?) করা হয়েছে
endpoints.MapGet("products/details/{id?}", async context =>
{
// চেক করা হচ্ছে id প্যারামিটারটি এসেছে কি না
if (context.Request.RouteValues.ContainsKey("id"))
{
// যদি আসে, তবে ভ্যালুটিকে integer-এ কনভার্ট করা হচ্ছে
int productId = Convert.ToInt32(context.Request.RouteValues["id"]);
await context.Response.WriteAsync($"Product details of ID: {productId}");
}
else
{
// যদি id না আসে (অর্থাৎ optional parameter null থাকে)
await context.Response.WriteAsync("ID is not supplied.");
}
});
});
(ইন্সট্রাক্টর শেষে একটি Practice Task দিয়েছেন: আগের Employee Profile-এর উদাহরণটিতে Default Value-এর বদলে Optional Parameter ব্যবহার করে প্র্যাকটিস করতে।)
২. মূল্যায়ন (Critical Evaluation)
-
সবল দিক (Strengths):
-
Convert.ToInt32(null)যে ডিফল্টভাবে0রিটার্ন করে— এই সূক্ষ্ম Technical Behavior-টি সুন্দরভাবে ধরিয়ে দেওয়া হয়েছে। -
Visual Studio-এর Immediate Window ব্যবহার করে Debugging-এর প্র্যাকটিক্যাল টিপস দেওয়া হয়েছে।
-
ContainsKeyমেথড ব্যবহার করে লজিক্যাল চেকিংয়ের পদ্ধতি বেশ কার্যকর। -
সীমাবদ্ধতা (Limitations):
-
ASP.NET Core-এ Route Parameters হ্যান্ডেল করার জন্য Model Binding (যেমন
int? id) কিভাবে কাজ করে, তা দেখানো হয়নি; শুধুমাত্র ম্যানুয়ালRouteValuesচেকিংয়ে ফোকাস করা হয়েছে।
৩. পরবর্তী ধাপ ও প্রাসঙ্গিক বিষয় (Future Learning Path)
Routing এবং Parameter Handling আরও ভালোভাবে আয়ত্ত করতে নিচের Keyword ও টপিকগুলো নিয়ে স্টাডি করতে পারো:
- Nullable Types (
int?,string?) - Model Binding in ASP.NET Core
- Route Constraints for Optional Parameters
- Catch-all Parameters (
{*catchall})