在我的mvc项目中,我需要重命名一个动作。在找到ActionName属性之后,我认为为了重新命名HomeController.Index操作,我必须做的唯一事情就是添加该属性。
我设置后:
[ActionName("Start")]
public ActionResult Index()
该操作不再找到该视图。它查找start.cshtml视图。 Url.Action("Index", "home")
也不会生成正确的链接。
这是正常行为吗?
答案 0 :(得分:2)
这是使用ActionName属性的结果。应该在操作之后命名,而不是在方法之后命名。
答案 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");
}