C# 如何使用asp.net mvc在视图中为控制器中的每个操作创建操作链接?

C# 如何使用asp.net mvc在视图中为控制器中的每个操作创建操作链接?,c#,asp.net-mvc,C#,Asp.net Mvc,因此,我在控制器中有20+Actions,如下所示: public ActionResult DoThis() { Image img = Image.FromFile("DoThis.png"); //some other stuff to be done. return View(); } public ActionResult DoThat() {

因此,我在控制器中有20+
Action
s,如下所示:

public  ActionResult DoThis()
        {
            Image img = Image.FromFile("DoThis.png");
            //some other stuff to be done.
            return View();
        }
public  ActionResult DoThat()
        {
            Image img = Image.FromFile("DoThat.png");
            //some other stuff to be done.
            return View();
        }
我有一个视图,我想为放置在控制器中的每个动作显示
ActionLink
,并为该动作指定图片,比如:

@foreach
{
   <div class="col-sm-4">
    <div class="product-image-wrapper">
        <div class="single-products">
            <div class="productinfo text-center">
                <img src="the image assigned to the controller actions" alt="" />
                <h3 style="font-family:'Myriad عربي'">Action Name ؟</h3>
                <a href="@URL.Action("The acion link from controller")" class="btn btn-default add-to-cart">Click Here</a>
            </div>
        </div>
    </div>
</div>
}
@foreach
{
行动名称؟
}

这是可能的还是我要求太多了

以下是获取控制器上所有操作的
ActionDescriptor[]
列表的一种方法:

@{
    var descriptor = new ReflectedControllerDescriptor(this.ViewContext.Controller.GetType());
    var actions = descriptor.GetCanonicalActions();
}

@foreach (var action in actions)
{
    <div>
        @Html.ActionLink("click me", action.ActionName)
    </div>
}
然后:

@{
    var descriptor = new ReflectedControllerDescriptor(this.ViewContext.Controller.GetType());
    var actions = descriptor.GetCanonicalActions().Where(desc => desc.GetCustomAttributes(typeof(MyActionAttribute), true).Any());
}

以下是获取控制器上所有操作的
ActionDescriptor[]
列表的一种方法:

@{
    var descriptor = new ReflectedControllerDescriptor(this.ViewContext.Controller.GetType());
    var actions = descriptor.GetCanonicalActions();
}

@foreach (var action in actions)
{
    <div>
        @Html.ActionLink("click me", action.ActionName)
    </div>
}
然后:

@{
    var descriptor = new ReflectedControllerDescriptor(this.ViewContext.Controller.GetType());
    var actions = descriptor.GetCanonicalActions().Where(desc => desc.GetCustomAttributes(typeof(MyActionAttribute), true).Any());
}

那么,你当然可以通过反射得到某个类的方法:

public List<string> GetActionNames()
{
    return typeof(HomeController)
        .GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
        .Where(method => method.ReturnType.IsSubclassOf(typeof(ActionResult)) || method.ReturnType == typeof(ActionResult))
        .Select(method => method.Name)
        .ToList();
}
public List GetActionNames()
{
返回类型(HomeController)
.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
.Where(method=>method.ReturnType.IsSubclassOf(typeof(ActionResult))| | method.ReturnType==typeof(ActionResult))
.Select(method=>method.Name)
.ToList();
}
这将返回控制器上定义的所有操作的名称,其中任何返回
ActionResult
兼容类型的操作都被视为操作方法,其他操作都不被视为操作方法。但是,你应该考虑如下:

  • 您将如何决定绑定到哪个参数
  • 您将如何处理重载方法
  • 您应该根据任何安全需求和其他限制完善此逻辑
  • <> LI>如果这些方法中的任何一个是非HTTPGET,您应该进一步过滤它们,您可以通过在它们上不具有<代码> HTTPPOST < /代码>属性来过滤这些方法(如果您处理的是<代码> ApiController <代码>,这将变得更加复杂,您还应该考虑基于名称前缀的方法约定)。

一般来说,第一个要点是最值得关注的,你最好只是手工输入链接,而不是试图找出一个可靠的、通用的解决方法。因此,我只建议您使用这样一种逻辑,前提是您可以确保上述内容不是您必须关心的事情。

好吧,您当然可以通过反射获得某个类的方法:

public List<string> GetActionNames()
{
    return typeof(HomeController)
        .GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
        .Where(method => method.ReturnType.IsSubclassOf(typeof(ActionResult)) || method.ReturnType == typeof(ActionResult))
        .Select(method => method.Name)
        .ToList();
}
public List GetActionNames()
{
返回类型(HomeController)
.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
.Where(method=>method.ReturnType.IsSubclassOf(typeof(ActionResult))| | method.ReturnType==typeof(ActionResult))
.Select(method=>method.Name)
.ToList();
}
这将返回控制器上定义的所有操作的名称,其中任何返回
ActionResult
兼容类型的操作都被视为操作方法,其他操作都不被视为操作方法。但是,你应该考虑如下:

  • 您将如何决定绑定到哪个参数
  • 您将如何处理重载方法
  • 您应该根据任何安全需求和其他限制完善此逻辑
  • <> LI>如果这些方法中的任何一个是非HTTPGET,您应该进一步过滤它们,您可以通过在它们上不具有<代码> HTTPPOST < /代码>属性来过滤这些方法(如果您处理的是<代码> ApiController <代码>,这将变得更加复杂,您还应该考虑基于名称前缀的方法约定)。

一般来说,第一个要点是最值得关注的,你最好只是手工输入链接,而不是试图找出一个可靠的、通用的解决方法。因此,我只建议您在可以确保上述内容不必关心的情况下使用这种逻辑。

您可以始终使用反射来获取控制器中每个方法的名称。不太清楚你想做什么,为什么?为什么不创建一个包含方法和关联映像的属性的项目集合?我只想动态地向控制器中的操作添加链接。我的意思是我不想为视图中控制器中的每个操作编写
@URL.Action
。可能吗?有时,我的控制器中的这些动作的数量可能会增加或减少,在我看来,这些动作应该自动处理。@StephenMuecke我有一个问题没有回答,请你看看,并就我急需解决的问题提出你的观点。非常感谢。这是问题的链接。MVC控制器不是“用图像做事情”的地方,通常是针对注入控制器的服务。您可以通过创建一组服务来解决这个问题,每个服务都对映像执行单独的操作,并使用字符串参数将控制器重构为单个操作方法,该参数确定要对映像执行的操作(从而激活哪个服务)。另一个例子见。因此,创建链接列表非常简单。
您始终可以使用反射来获取控制器中每个方法的名称。不太清楚你想做什么,为什么?为什么不创建一个包含方法和关联映像的属性的项目集合?我只想动态地向控制器中的操作添加链接。我的意思是我不想为视图中控制器中的每个操作编写
@URL.Action
。可能吗?有时,我的控制器中的这些动作的数量可能会增加或减少,在我看来,这些动作应该自动处理。@StephenMuecke我有一个问题没有回答,请你看看,并就我急需解决的问题提出你的观点。非常感谢。这是问题的链接。MVC控制器不是“做”的地方