0

如何删除 asp.net mvc3 中的子操作。我的意思是我有部分观点和主要观点。在我进入子页面时的 url 栏中,它不应该加载。

假设我的主页是

本地主机:5820/首页/索引

然后当我进入

本地主机:5820/首页/索引

那么它应该可以工作并且子项是

本地主机:5820/首页/关于

然后当我进入

本地主机:5820/首页/关于

那么它不应该打开。我怎么能在 asp.net mvc 中做到这一点。我有几个这样的页面,我已经展示了如何纠正这个问题的页面

4

2 回答 2

1

看起来您正在寻找ChildActionOnly属性:

[ChildActionOnly]
public ActionResult About()
{
    return View();
}

它禁用直接调用localhost:5820/Home/About- 仅呈现为部分视图可用。

根据您的需要进行更新ChildActionOnly- 标记所有应返回带有属性的部分视图的操作:

public ActionResult Index()
{
    return View();
}

[ChildActionOnly]
public ActionResult About()
{
    var model = ...
    return PartialView("_About", model);
}

在索引视图中,Home通过以下方式调用这些操作(来自控制器和其他控制器):

@Html.Action("About", "Home")
于 2012-12-08T10:56:27.000 回答
0

您的 ABOUT 页​​面是 HOME 页面内的链接这一事实并不意味着它是子操作,实际上,从 MVC 的角度来看,它们处于同一级别,是您作为程序员产生了层次结构的错觉通过提供导航顺序。

现在,您可以做的是:

  1. 只需从控制器中删除操作方法,或者

  2. 编写一个简单的忽略路由,例如:

    routes.IgnoreRoute("YourRuleToIgnoreActions");

此规则应位于 RegisterRoutes 中 RegisterRoutes 方法的开头,以避免触发其他规则

为了建立你的忽略规则,这里是关于这个主题的一个很好的讨论:http: //ardalis.com/IgnoreRoute-in-ASP.NET-Routing-is-Order-Dependent

更新:可能想太多了,但在我看来,模型可以具有修改视图行为的属性,这是因为从架构的角度来看,当您已经在视图中时,您只关心在表示层上,所以我认为拥有类似的东西是完全有效的:

 public class MyReportsModel{
     public bool displaySection1 { get; set;}
    //other data
 }

在您的观点中,您可以通过以下方式更改演示文稿:

  @{
   if(@Model.displaySection1){
        //display as normal
    }

}

当然,当您填充模型时,您应该根据需要在每个控制器中设置该属性:

  MyReporstModel thisView = new MyReportsModel();
  thisView.displaySection1 = true;
   // set all properties necessary to display

   // if the controller knows that this partial view won't be displayed then 
    thisView.displaySection1 = false;

但这不再是技术问题,而是架构问题。

希望能帮助到你,

于 2012-12-08T10:11:05.103 回答