Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ActionName的目的_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc ActionName的目的

Asp.net mvc ActionName的目的,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,使用“ActionName”属性为操作方法设置别名有什么好处?我真的看不出它有什么好处,因为它为用户提供了使用其他名称调用动作方法的选项。指定别名后,用户只能使用别名调用操作方法。但是如果这是必需的,那么为什么用户不更改操作方法的名称而不是为其指定别名呢 如果有人能给我举一个例子,说明“ActionName”在某个场景中的使用,我会非常感激,因为在这个场景中,“ActionName”可以带来巨大的好处,或者是最好的使用方式 它允许您以数字开始操作,或在标识符中包含.net不允许的任何字符。-最常

使用“ActionName”属性为操作方法设置别名有什么好处?我真的看不出它有什么好处,因为它为用户提供了使用其他名称调用动作方法的选项。指定别名后,用户只能使用别名调用操作方法。但是如果这是必需的,那么为什么用户不更改操作方法的名称而不是为其指定别名呢

如果有人能给我举一个例子,说明“ActionName”在某个场景中的使用,我会非常感激,因为在这个场景中,“ActionName”可以带来巨大的好处,或者是最好的使用方式

它允许您以数字开始操作,或在标识符中包含.net不允许的任何字符。-最常见的原因是它允许您有两个具有相同签名的操作(请参阅任何脚手架控制器的GET/POST Delete操作)

例如:您可以在url操作名称
http://example.com/products/create-product
vs
http://example.com/products/createproduct
http://example.com/products/create_product

public class ProductsController {

    [ActionName("create-product")]
    public ActionResult CreateProduct() {
        return View();
    }

}

如果您有两个具有相同签名的操作,并且它们应该具有相同的url,那么它也很有用

一个简单的例子:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}

我在用户下载报告时使用它,这样他们就可以轻松地将csv文件直接打开到Excel中

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}

当您需要实现方法重载时,它也很有用

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


        [ActionName("ActorViewOverload")]
        public ActionResult ActorView(int id)
        {              
            return RedirectToAction("ActorView","Home");
        }
`
这里一个ActorView不接受任何参数,另一个接受int。 第一种方法用于查看参与者列表,另一种方法用于删除ID为“ID”的项目后显示相同的参与者列表。 无论何时需要方法重载,都可以将操作名称用作“ActorViewOverload”。

请尝试以下代码:

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


        [ActionName("ActorViewOverload")]
        public ActionResult ActorView(int id)
        {              
            return RedirectToAction("ActorView","Home");
        }
`
public class ProductsController
 {

    [ActionName("create-product")]
    public ActionResult CreateProduct() 
    {
        return View("CreateProduct");
    }

}

此类表示用于操作名称的属性。它还允许开发人员使用不同于方法名的操作名。

它还允许您使用可能是
控制器上的方法的操作名,如视图或文件。@gram,我们不能在控制器上调用普通方法而不指定别名吗?我想我们可以。如果您想命名您的
操作
视图()
,那么您就会遇到问题,因为当前控制器中对
视图()
的所有引用都将解析为该
操作
,而不是底层基本方法。因此,为了解决这个问题,您可以使用
ActionName
属性来允许
视图
操作,但在内部,您可以将其称为
PublicView
或类似的东西。我想您必须
返回视图(“CreateProduct”)
或.NET会唠叨找不到视图,例如
创建产品.aspx
创建产品.cshtml
——至少我的代码是这样工作的。@gram那你怎么做呢?显然不带属性。有意义,但在什么情况下使用不带参数的HttpPost?我知道有可能的原因,比如返回JSON和使用GET避免安全问题。我只是想知道你的是什么。参数列表不是这里的重要部分。也许有一个更好的例子,关键是如果需要,你可以这样做。我们可以将“SomeActionPost”替换为“SomeAction”,那么ActionName有什么用呢?你可以';如果两个方法具有相同的参数,则不能将它们命名为相同的方法。在这种情况下,[ActionName]将操作(而不是方法)重命名为在ASP中注册的操作。NET MVC将表路由到目标表。最常见的原因是当您同时使用GET和POST方法并且签名相同时。请看@Carlos Muñoz的回答,这非常聪明:)