ActionFilter在View中设置一个controller.action参数,但在ActionLink上设置param req

时间:2009-06-26 10:53:17

标签: asp.net-mvc model-view-controller controller action-filter

我们有一个[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 :(得分:0)

这是一个编译时错误 - 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)) %>

答案 1 :(得分:0)

是的,必须在控制器中声明一个重载的存根操作。我所做的是声明存根以匹配userName没有参数的实例,因此我们得到一个干净的编译。然后我按照图示装饰了这个重载动作,以确保它永远不会被调用。现在一切都很笨拙。

为罗伯特的回复干杯

    [ActionName("UNCALLABLE")]
    public ActionResult Category(int categoryId, int page)
    {
        return View();
    }