আমার দুটি ক্রিয়া পদ্ধতি রয়েছে যেগুলি পরস্পরবিরোধী। মূলত, আমি দুটি আইটেমের আইডি দ্বারা বা আইটেমের নাম এবং তার পিতামাতার (আইটেমগুলির বিভিন্ন পিতা-মাতার জুড়ে একই নাম থাকতে পারে) দ্বারা দুটি ভিন্ন ভিন্ন রুট ব্যবহার করে একই দর্শন পেতে সক্ষম হতে চাই। তালিকাকে ফিল্টার করার জন্য একটি অনুসন্ধান শব্দ ব্যবহার করা যেতে পারে।
উদাহরণ স্বরূপ...
Items/{action}/ParentName/ItemName
Items/{action}/1234-4321-1234-4321
এখানে আমার ক্রিয়া পদ্ধতিগুলি রয়েছে ( Remove
ক্রিয়া পদ্ধতিও রয়েছে) ...
// Method #1
public ActionResult Assign(string parentName, string itemName) {
// Logic to retrieve item's ID here...
string itemId = ...;
return RedirectToAction("Assign", "Items", new { itemId });
}
// Method #2
public ActionResult Assign(string itemId, string searchTerm, int? page) { ... }
এবং এখানে রুটগুলি ...
routes.MapRoute("AssignRemove",
"Items/{action}/{itemId}",
new { controller = "Items" }
);
routes.MapRoute("AssignRemovePretty",
"Items/{action}/{parentName}/{itemName}",
new { controller = "Items" }
);
আমি বুঝতে পারি যে ত্রুটি কেন ঘটছে, যেহেতু page
প্যারামিটারটি শূন্য হতে পারে তবে আমি এটি সমাধান করার সর্বোত্তম উপায়টি বের করতে পারি না। আমার ডিজাইনটি কি শুরু করা খারাপ? আমি Method #1
অনুসন্ধানের পরামিতিগুলি অন্তর্ভুক্ত করার জন্য যুক্তিটির সই বাড়াতে এবং যুক্তিটি Method #2
একটি ব্যক্তিগত পদ্ধতিতে সরিয়ে নিয়ে যাব যে তারা দুজনেই ডাকবে বলে আমি ভেবেছিলাম, তবে আমি বিশ্বাস করি না যে প্রকৃতপক্ষে অস্পষ্টতাটি সমাধান হবে।
কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।
আসল সমাধান (লেবির উত্তরের ভিত্তিতে)
আমি নিম্নলিখিত ক্লাস যুক্ত করেছি ...
public class RequireRouteValuesAttribute : ActionMethodSelectorAttribute {
public RequireRouteValuesAttribute(string[] valueNames) {
ValueNames = valueNames;
}
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) {
bool contains = false;
foreach (var value in ValueNames) {
contains = controllerContext.RequestContext.RouteData.Values.ContainsKey(value);
if (!contains) break;
}
return contains;
}
public string[] ValueNames { get; private set; }
}
এবং তারপরে অ্যাকশন পদ্ধতিগুলি সজ্জিত করুন ...
[RequireRouteValues(new[] { "parentName", "itemName" })]
public ActionResult Assign(string parentName, string itemName) { ... }
[RequireRouteValues(new[] { "itemId" })]
public ActionResult Assign(string itemId) { ... }
return ValueNames.All(v => controllerContext.RequestContext.RouteData.Values.ContainsKey(v));
contains = ...
এই জাতীয় contains = controllerContext.RequestContext.RouteData.Values.ContainsKey(value) || controllerContext.RequestContext.HttpContext.Request.Params.AllKeys.Contains(value);
ActionResult DoSomething(Person p)
যেখানে Person
বিভিন্ন সরল বৈশিষ্ট্য রয়েছে যেমন Name
এবং এটিতে অনুরোধগুলি সরাসরি সম্পত্তি নামের সাথে করা হয় (যেমন, /dosomething/?name=joe+someone&other=properties
)।
controllerContext.HttpContext.Request[value] != null
পরিবর্তে ব্যবহার করা উচিত controllerContext.RequestContext.RouteData.Values.ContainsKey(value)
; তবে তবুও কাজের একটি সুন্দর অংশ।