ActionFilter для установки параметра controller.action, но с параметром req для ActionLink в представлении - PullRequest
0 голосов
/ 26 июня 2009

У нас есть [UserNameFilter] ActionFilterAtrribute, который заполняет параметр имени пользователя действий контроллера. Это хорошо работает. Однако, когда я использую хелпер Html.ActionLink, строго типизированный для контроллера, компилятор запрашивает указанный параметр имени пользователя в представлении.

Кто-нибудь сталкивался с этим и знает, как читать?

Действие контроллера:

[UserNameFilter]
public ActionResult Category(int categoryId, int page, string userName)

Код в представлении:

<%= Html.RenderTree(ViewData.Model, i => Html.ActionLink<ProductController>(pc =>
    pc.Category(i.CategoryId, 1, **Complier error here**),i.CategoryName)) %>

Ответы [ 2 ]

0 голосов
/ 29 июня 2009

Да, нужно объявить перегруженное действие заглушки в контроллере. Что я сделал, так это объявил заглушку, чтобы соответствовать экземпляру, где нет параметра userName, таким образом, мы получаем чистую компиляцию Затем я украсил это перегруженное действие, как показано, чтобы оно никогда не вызывалось. Теперь все в порядке.

Приветствия за ответ Роберт

    [ActionName("UNCALLABLE")]
    public ActionResult Category(int categoryId, int page)
    {
        return View();
    }
0 голосов
/ 26 июня 2009

Это ошибка времени компиляции - компилятор C # ничего не знает о вашем приложении, MVC или ActionFilter, которые вы используете, поэтому он не может знать, как заполнить параметр userName.

На пути, который я сейчас могу придумать, это объявить новое действие в контроллере

public ActionResult CategoryNoUser(int categoryId, int page)
{
   string userName = ""; /* get username here same way you do in action filter */
   return Category(categoryId, page, userName);
}

и используйте это по вашему мнению.

Если вы можете получить доступ к имени пользователя в представлении, вы можете указать его для текущего действия в категории:

<%= Html.RenderTree(ViewData.Model, i => Html.ActionLink<ProductController>(pc =>
    pc.Category(i.CategoryId, 1, CurrentUser.UserName),i.CategoryName)) %>

или, если вы можете указать имя пользователя в модели:

<%= Html.RenderTree(ViewData.Model, i => Html.ActionLink<ProductController>(pc =>
    pc.Category(i.CategoryId, 1, Model.UserName),i.CategoryName)) %>
...