我们有一个[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)) %>
答案 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();
}