今天看到CSDN上有個問題覺得有點意思:"可不可以ASP.NET MVC所有引數均自動設定為預設"
public class HomeController : Controller { public ActionResult Index(int para1,string para2,int para3,bool para4) { return View(); } }
如果不配置路由,直接訪問localhost會報錯,因為其中一些引數沒有賦值
<span><h1>“/”應用程式中的伺服器錯誤。<hr color="silver" size="1" width="100%"></h1> <h2> <i>對於“MvcApplication1.Controllers.HomeController”中方法“System.Web.Mvc.ActionResult Index(Int32, System.String, Int32, Boolean)”的不可以為 null 的型別“System.Int32”的引數“para1”,引數字典包含一個 null 項。可選引數必須為引用型別、可以為 null 的型別或宣告為可選引數。<br>引數名: parameters</i> </h2></span>
從這個錯誤其實可以看出MVC已經找到了對應的Action,這時我們只需要在呼叫前做些處理,為引數賦預設值就行了。
這時就可以用到OnActionExecuting 方法 http://msdn.microsoft.com/zh-cn/library/system.web.mvc.controller.onactionexecuting%28v=vs.118%29.aspx
public class HomeController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { var methodInfo = ((ReflectedActionDescriptor) filterContext.ActionDescriptor).MethodInfo; foreach (var p in methodInfo.GetParameters()) { if (p.ParameterType.IsValueType) { filterContext.ActionParameters[p.Name] = Activator.CreateInstance(p.ParameterType); } } } public ActionResult Index(int para1, string para2, int para3, bool para4) { Debug.Print("para1:{0} para2:{1} para3:{2} para4 :{3}",para1, para2, para3, para4); return View(); } }
成功!