2014-02-24 63 views
0

我想设计一个模型,用某种方式来指定一个Controller Action用于搜索。我不想将操作的URL指定为字符串,因为如果该操作不存在,我不希望该应用程序编译。实例化ActionDescriptor

从我所知道的,好像我应该指定,像这样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

您可以声明一个Func委托属性,并在模型中使用您的Action设置的相应操作特定类型参数。

public class myModel { 
    public string id { get; set; } 
    //Specify your specific Action's type arguments here 
    public Func<,> search_action { get; set; } 
} 
0

首先,我不得不问为什么需要存储的动作本身作为模型的一部分。这似乎是错误的方法;但我又缺乏背景和理由,为什么你要这样做。

如果只想要具有操作存在的编译安全性,则最好根据控制器的类型创建表达式方法,然后从中提取动作名称string(如this answers suggest)。

如果在另一方面,你真的想能够从模型执行此操作使用ActionDescriptor(只存储有关操作信息)或Func<,>((甚至理解多么糟糕的主意,这是后)只存储IL,而不是名称,上下文或控制器),只会让你一半。

所以再说一遍,我问,为什么你需要这样做?