ASP MVC ActionNameAttribute - PullRequest
       2

ASP MVC ActionNameAttribute

1 голос
/ 29 января 2012

В моем проекте MVC мне нужно переименовать действие. После нахождения атрибута ActionName я подумал, что единственное, что мне нужно сделать, чтобы переименовать действие HomeController.Index, которое нужно запустить, - это добавить этот атрибут.

После того, как я установил:

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

Действие больше не находит вид. Он ищет представление start.cshtml. Также Url.Action("Index", "home") не генерирует правильную ссылку.

Это нормальное поведение?

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Это является следствием использования атрибута ActionName. Вид должен быть назван после действия, а не после метода.

Вот еще

0 голосов
/ 29 января 2012

Это нормальное поведение.

Назначение атрибута ActionName, по-видимому, предназначено для сценариев, в которых вы можете получить 2 идентичных действия, которые отличаются только с точки зрения запросов, которые они обрабатывают. Если в результате вы получите такие действия, компилятор выдаст сообщение об ошибке:

Тип 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");
}
0 голосов
/ 29 января 2012

вам нужно вернуться в действие:

return View("Index");//if 'Index' is the name of the view
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...