我想设计一个模型,用某种方式指定用于搜索的Controller Action。我不想将操作的url指定为字符串,因为如果该操作不存在,我不希望应用程序编译。
据我所知,似乎我应该像这样指定System.Web.Mvc.ActionDescriptor
类型的属性:
public class myModel {
public string id { get; set; }
...
public ActionDescriptor search_action { get; set; }
}
从this SO post我看到如何遍历所有控制器上的所有操作,但我无法实例化ActionDescriptor
来设置属性。
我希望能够对此做一些修改:
myModel m = new myModel();
m.search_action =
(ActionDescriptor)new myNamespace.Controllers.myController().myAction;
但没有到达任何地方。
我错过了什么吗?如何将Controller Action指定为模型的属性?这甚至可能吗?
答案 0 :(得分:0)
您可以使用Action
设置的模型中的相应操作特定类型参数声明Func
委托属性。
public class myModel {
public string id { get; set; }
//Specify your specific Action's type arguments here
public Func<,> search_action { get; set; }
}
答案 1 :(得分:0)
首先,我不得不问为什么你需要将动作本身存储为模型的一部分。这似乎是错误的做法;但同样,我缺乏关于你为什么要这样做的背景和理由。
如果只想让操作存在的编译安全性,最好根据控制器的类型创建表达式方法,并从中提取string
操作名称(如this answers suggest })。
如果另一方面,你实际上希望能够使用ActionDescriptor
(仅存储有关动作的信息)或者从模型中执行此操作(即使在了解了这个想法有多糟糕之后)一个Func<,>
(只存储IL,而不是名称,上下文或控制器),只会让你到一半。
同样,我问,为什么你需要这样做?