ASP MVC ActionNameAttribute

时间:2012-01-29 13:43:27

标签: asp.net-mvc asp.net-mvc-3

在我的mvc项目中,我需要重命名一个动作。在找到ActionName属性之后,我认为为了重新命名HomeController.Index操作,我必须做的唯一事情就是添加该属性。

我设置后:

[ActionName("Start")]
public ActionResult Index()

该操作不再找到该视图。它查找start.cshtml视图。 Url.Action("Index", "home")也不会生成正确的链接。

这是正常行为吗?

3 个答案:

答案 0 :(得分:2)

这是使用ActionName属性的结果。应该在操作之后命名,而不是在方法之后命名。

Here is more

答案 1 :(得分:0)

你需要在行动中返回:

return View("Index");//if 'Index' is the name of the view

答案 2 :(得分:0)

这是正常行为。

ActionName属性的目的似乎是针对两种相同的操作,这些操作仅在它们处理的请求方面有所不同。如果您最终采取类似的操作,编译器会抱怨此错误:

  

Type YourController已经定义了一个名为YourAction的成员   相同的参数类型。

我还没有看到它在许多情况下发生过,但确实发生的情况是删除记录时。考虑:

[HttpGet]
public ActionResult Delete(int id)
{
    var model = repository.Find(id);

    // Display a view to confirm if the user wants to delete this record.
    return View(model);
}

[HttpPost]
public ActionResult Delete(int id)
{
    repository.Delete(id);

    return RedirectToAction("Index");
}

两种方法都采用相同的参数类型并具有相同的名称。尽管它们使用不同的HttpX属性进行修饰,但这还不足以让编译器区分它们。通过更改POST操作的名称并使用ActionName("Delete")标记它,它允许编译器区分这两者。所以行动最终看起来像这样:

[HttpGet]
public ActionResult Delete(int id)
{
    var model = repository.Find(id);

    // Display a view to confirm if the user wants to delete this record.
    return View(model);
}

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
    repository.Delete(id);

    return RedirectToAction("Index");
}