如何在asp.net mvc3中删除子操作

时间:2012-12-08 09:34:16

标签: c# asp.net-mvc asp.net-mvc-3

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

假设我的主页是

  

localhost:5820 / Home / Index

然后当我进入

  

本地主机:5820 /家庭/索引

然后它应该工作,子项是

  

本地主机:5820 /首页/

然后当我进入

  

localhost:5820 / Home / About

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

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

您的ABOUT页面是您的HOME页面内的链接这一事实并不意味着它是一个子操作,事实上,从MVC的角度来看它们处于同一级别,是您作为程序员给出的通过提供导航命令来讨论hiereachies。

现在,您可以做的是:

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

  2. 写一个简单的忽略路线,如:

    routes.IgnoreRoute( “YourRuleToIgnoreActions”);

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

    要构建您的忽略规则,以下是关于该主题的精彩讨论:http://ardalis.com/IgnoreRoute-in-ASP.NET-Routing-is-Order-Dependent

    更新 的: 可能在这个问题上有太多的想法,但在我看来,模型可以具有修改View行为的属性,这是因为从架构的角度来看,当你已经在View中时,你的关注点完全在于表示层,所以我认为这样的东西是完全有效的:

     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;
    

    但这不再是技术问题,而是建筑问题。

    希望它有所帮助,