NonAction एट्रिब्यूट का उपयोग तब किया जाता है जब हम एक कंट्रोलर में एक पब्लिक मेथड चाहते हैं लेकिन उसे एक्शन मेथड के रूप में ट्रीट नहीं करना चाहते। एक एक्शन मेथड एक कंट्रोलर में एक पब्लिक मेथड है जिसे URL का उपयोग करके इनवोक किया जा सकता है। इसलिए, डिफ़ॉल्ट रूप से, यदि कंट्रोलर में कोई पब्लिक मेथड है तो उसे URL रिक्वेस्ट का उपयोग करके इनवोक किया जा सकता है। कंट्रोलर में पब्लिक मेथड्स तक एक्सेस को प्रतिबंधित करने के लिए, NonAction एट्रिब्यूट का उपयोग किया जा सकता है।
समस्या: डिफ़ॉल्ट रूप से सभी पब्लिक मेथड्स एक्शन होते हैं
कंट्रोलर बिना NonAction के
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers
{
public class HomeController : Controller
{
public string MyMethod1()
{
return "My Method 1 Invoked
";
}
public string MyMethod2()
{
return "My Method 2 Invoked
";
}
}
}
दोनों मेथड्स URL के माध्यम से एक्सेसिबल हैं:
https://localhost:59146/Home/MyMethod1https://localhost:59146/Home/MyMethod2


समाधान: NonAction एट्रिब्यूट का उपयोग करें
मान लीजिए MyMethod2 किसी आंतरिक उद्देश्य के लिए है, और हम नहीं चाहते कि इसे URL रिक्वेस्ट का उपयोग करके इनवोक किया जाए। इसे प्राप्त करने के लिए, हमें इसे NonAction एट्रिब्यूट से डेकोरेट करना होगा।
NonAction के साथ कंट्रोलर
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers
{
public class HomeController : Controller
{
public string MyMethod1()
{
return "My Method 1 Invoked
";
}
// यह मेथड अब URL के माध्यम से एक्सेसिबल नहीं है
[NonAction]
public string MyMethod2()
{
return "My Method 2 Invoked
";
}
}
}
आउटपुट: MyMethod2 को NonAction बनाने के बाद

अब /Home/MyMethod2 एक्सेस करने पर 404 एरर मिलेगा, जबकि /Home/MyMethod1 अभी भी काम करता है।
NonAction vs अन्य दृष्टिकोण
| दृष्टिकोण | URL से एक्सेसिबल | कंट्रोलर के भीतर कॉल करने योग्य | उपयोग मामला |
|---|---|---|---|
| पब्लिक मेथड (डिफ़ॉल्ट) | हां | हां | सामान्य एक्शन्स |
[NonAction] | नहीं | हां | हेल्पर मेथड्स, इंटरनल लॉजिक |
private मेथड | नहीं | हां | सख्ती से इंटरनल लॉजिक |
[ChildActionOnly] | नहीं | केवल @Html.Action/RenderAction के माध्यम से | व्यू पार्शियल्स/विजेट्स |
NonAction के सामान्य उपयोग मामले
1. हेल्पर/यूटिलिटी मेथड्स
public class BaseController : Controller
{
[NonAction]
protected string RenderViewToString(string viewName, object model)
{
// व्यू को स्ट्रिंग में रेंडर करने की लॉजिक
}
[NonAction]
protected JsonResult JsonSuccess(object data = null)
{
return Json(new { Success = true, Data = data }, JsonRequestBehavior.AllowGet);
}
}
2. फैक्टरी/बिल्डर मेथड्स
public class ProductController : Controller
{
[NonAction]
private ProductViewModel BuildViewModel(Product product)
{
return new ProductViewModel
{
Id = product.Id,
Name = product.Name,
Price = product.Price,
CategoryName = product.Category?.Name,
InStock = product.Stock > 0
};
}
public ActionResult Details(int id)
{
var product = _repo.Get(id);
var model = BuildViewModel(product); // इंटरनल कॉल
return View(model);
}
}
3. ओवरलोडिंग संघर्ष से बचना
public class UserController : Controller
{
// यह एक्शन है - /User/Profile/123
public ActionResult Profile(int id) { ... }
// यह भी एक्शन बन जाएगा - /User/Profile?name=john (संघर्ष!)
// [NonAction] जोड़कर संघर्ष रोकें
[NonAction]
public ActionResult Profile(string name) { ... }
}
ASP.NET Core में समतुल्य
ASP.NET Core में [NonAction] एट्रिब्यूट Microsoft.AspNetCore.Mvc नेमस्पेस में उपलब्ध है और समान तरीके से काम करता है:
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
public IActionResult Index() => View();
[NonAction]
public string InternalHelper() => "Internal";
}
अतिरिक्त रूप से, ASP.NET Core में आप केवल private या protected मेथड्स का उपयोग कर सकते हैं (जो स्वचालित रूप से एक्शन नहीं होते), या एट्रिब्यूट रूटिंग का उपयोग करके केवल एट्रिब्यूटेड मेथड्स को एक्शन बनाएं:
[Route("api/[controller]")]
[ApiController]
public class ApiController : ControllerBase
{
// केवल एट्रिब्यूटेड मेथड्स ही एक्शन हैं
[HttpGet]
public IActionResult Get() => Ok();
// यह एक्शन नहीं है (कोई HTTP एट्रिब्यूट नहीं)
public string Helper() => "Internal";
}