Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 区域持久性边栏MVC 3_C#_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

C# 区域持久性边栏MVC 3

C# 区域持久性边栏MVC 3,c#,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,我的web应用程序中有一个区域。这个区域有几个控制器。有一个控制器处理该区域的入口(即,所有东西都通过该控制器访问该区域中的其他控制器)。此控制器需要将ID传递给操作: public ActionResult Index(Guid appID) { var vm = new DeviceManagementViewModel { SelectedApp = appID, App = _reposito

我的web应用程序中有一个区域。这个区域有几个控制器。有一个控制器处理该区域的入口(即,所有东西都通过该控制器访问该区域中的其他控制器)。此控制器需要将ID传递给操作:

    public ActionResult Index(Guid appID)
    {
        var vm = new DeviceManagementViewModel
        {
            SelectedApp = appID,
            App = _repository.AUTs.FirstOrDefault(x => x.ID.Equals(appID)),
            Devices = GetDevices()
        };

        return View(vm);
    }
它创建的视图然后用另一个ID发回。因此,现在有两个ID已经获得并在整个区域中保持

每个控制器中的每个创建、编辑和详细信息操作都需要传递这两个ID,以便显示正确的数据,例如:

    public ActionResult Create(Guid appID, Guid deviceID)
    {
        var vm = new InputViewModel
        {
            Device = deviceID,
            Application = appID
        };

        return View(vm);
    }
现在,如果我能有一个侧边栏,它有到每个细节的快速链接,并用相关ID填写创建操作,那就太好了,例如:

@Html.ActionLink("Create Input Methods", "Create", "Input", new { appID = <-- ID ONE -->, deviceID = <-- ID TWO --> }, null)
这将有一个如下所示的ViewModel:

public class MenuViewModel
{
    public Guid ApplicationID {get; set;}
    public Guid DeviceID {get; set;}
}
和这样的局部视图:

<aside id="dashboard_menu">
<div id="extras">
    <div class="oi">
        <h2 class="screenreader-only">Menu</h2>

        <div class="rollup section">
            <h3 class="rollup-trigger">Input Methods</h3> 
            <p>View or Add more Input Methods</p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        </div>
        <div class="rollup section">
            <h3 class="rollup-trigger">Launch &amp; Exit</h3> 
            <p>View or Add more Launch &amp; Exit</p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        </div>
        <div class="rollup section">
            <h3 class="rollup-trigger">Performance</h3> 
            <p>View or Add more Performance</p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        </div>
        <div class="rollup section">
            <h3 class="rollup-trigger">Power Consumption</h3> 
            <p>View or Add more Power Consumption</p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        </div>
        <div class="rollup section">
            <h3 class="rollup-trigger">Qualitative Validation</h3> 
            <p>View or Add more Qualitative Validation</p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
            <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        </div>

    </div>
</div>

推出及;出口 查看或添加更多发布&;出口

演出 查看或添加更多性能

功耗 查看或添加更多功耗

定性验证 查看或添加更多定性验证

那么现在,我如何使它持久化,我是否在该区域的_Layout.cshtml中使用它?如果是,怎么做

我是否在每个查看页面中都使用它?如果是,我怎么能不这样做,因为它似乎比必要的工作更多


我所困惑的是,如何将这些ID参数传递给部分视图,以及从何处加载部分视图?

因此,答案在于以下几点:

不幸的是,这是一个逐浏览页面的答案

在布局页面中定义一个部分:

@if (IsSectionDefined("SideBar"))
{
    @RenderSection("SideBar")
}
else
{
    <div id="extras">
        <div class="oi">
            <h2 class="screenreader-only">Menu</h2>

            <div class="rollup section">
                <h3 class="rollup-trigger">Application Validation</h3> 
                <p>Goto all Applications</p>
                <p class="more"><a href="#">&raquo; @Html.ActionLink("All Applications", "Index", "Application", new { area = "Validation" }, null)</a></p>
            </div>
        </div>
    </div>   
}
在菜单部分视图中,将显示:

<div id="extras">
<div class="oi">
    <h2 class="screenreader-only">Menu</h2>

    <div class="rollup section">
        <h3 class="rollup-trigger">Input Methods</h3> 
        <p>View or Add more Input Methods</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Launch &amp; Exit</h3> 
        <p>View or Add more Launch &amp; Exit</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Performance</h3> 
        <p>View or Add more Performance</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Power Consumption</h3> 
        <p>View or Add more Power Consumption</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Qualitative Validation</h3> 
        <p>View or Add more Qualitative Validation</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>

</div>

菜单
输入法
查看或添加更多输入方法

推出及;出口 查看或添加更多发布&;出口

演出 查看或添加更多性能

功耗 查看或添加更多功耗

定性验证 查看或添加更多定性验证

菜单操作将与问题中的操作类似


完成了。在没有答案的情况下,它比我预期的更优雅。但这正是我所需要的。

因此,答案就在于以下几点:

不幸的是,这是一个逐浏览页面的答案

在布局页面中定义一个部分:

@if (IsSectionDefined("SideBar"))
{
    @RenderSection("SideBar")
}
else
{
    <div id="extras">
        <div class="oi">
            <h2 class="screenreader-only">Menu</h2>

            <div class="rollup section">
                <h3 class="rollup-trigger">Application Validation</h3> 
                <p>Goto all Applications</p>
                <p class="more"><a href="#">&raquo; @Html.ActionLink("All Applications", "Index", "Application", new { area = "Validation" }, null)</a></p>
            </div>
        </div>
    </div>   
}
在菜单部分视图中,将显示:

<div id="extras">
<div class="oi">
    <h2 class="screenreader-only">Menu</h2>

    <div class="rollup section">
        <h3 class="rollup-trigger">Input Methods</h3> 
        <p>View or Add more Input Methods</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Input", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Launch &amp; Exit</h3> 
        <p>View or Add more Launch &amp; Exit</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Launch", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Performance</h3> 
        <p>View or Add more Performance</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Performance", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Power Consumption</h3> 
        <p>View or Add more Power Consumption</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Power", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>
    <div class="rollup section">
        <h3 class="rollup-trigger">Qualitative Validation</h3> 
        <p>View or Add more Qualitative Validation</p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("View", "Index", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
        <p class="more"><a href="#">&raquo; @Html.ActionLink("Add", "Create", "Qual", new { appID = Model.ApplicationID, deviceID = Model.DeviceID}, null)</a></p>
    </div>

</div>

菜单
输入法
查看或添加更多输入方法

推出及;出口 查看或添加更多发布&;出口

演出 查看或添加更多性能

功耗 查看或添加更多功耗

定性验证 查看或添加更多定性验证

菜单操作将与问题中的操作类似


完成了。在没有答案的情况下,它比我预期的更优雅。但这正是我所需要的。

如果您需要能够为每个视图指定不同的边栏操作,那么您的解决方案将非常棒;但是,如果您需要特定于区域的侧栏,这会在每个视图中增加不必要的开销和重复,这可能会使您的解决方案在发生任何变化时难以管理

为了避免这种情况,您可以尝试为每个区域创建一个
BaseController
,用于指定边栏操作。然后,您可以确定视图中的当前区域,并使用该区域通过
RenderAction

public class SomeAreaBaseController : Controller
{
    public SomeAreaBaseController()
    {
        ViewBag.HasSidebar = true;
        ViewBag.Application = ...;
        ViewBag.Device = ...;
    }
    public ActionResult Menu(Guid appID, Guid deviceID)
    {
        ...
    }
}
现在,从该区域的其他控制器中继承:

public class SomeController : SomeAreaBaseController
然后,在
Layout.cshtml

@if (ViewBag.HasSidebar) {
    @Html.RenderAction("Menu", ViewContext.RouteData.Values["controller"], 
        new { appID = ViewBag.Application, deviceID = ViewBag.Device })
}

如果您需要能够为每个视图指定不同的边栏操作,那么您的解决方案将非常棒;但是,如果您需要特定于区域的侧栏,这会在每个视图中增加不必要的开销和重复,这可能会使您的解决方案在发生任何变化时难以管理

为了避免这种情况,您可以尝试为每个区域创建一个
BaseController
,用于指定边栏操作。然后,您可以确定视图中的当前区域,并使用该区域通过
RenderAction

public class SomeAreaBaseController : Controller
{
    public SomeAreaBaseController()
    {
        ViewBag.HasSidebar = true;
        ViewBag.Application = ...;
        ViewBag.Device = ...;
    }
    public ActionResult Menu(Guid appID, Guid deviceID)
    {
        ...
    }
}
现在,从该区域的其他控制器中继承:

public class SomeController : SomeAreaBaseController
然后,在
Layout.cshtml

@if (ViewBag.HasSidebar) {
    @Html.RenderAction("Menu", ViewContext.RouteData.Values["controller"], 
        new { appID = ViewBag.Application, deviceID = ViewBag.Device })
}

模型来自哪里?布局没有从菜单ActionGood question返回的MenuViewModel的模型。我忽略了这一点,但我个人认为,对于如此简单的参数,最好在每次请求时使用您通常使用的任何方法将它们添加到ViewBag中,并从视图中检索它们。如果您的操作开始需要更复杂的模型,您可以在
BaseController
中显式创建此模型,并将
ViewBag.SomeModel
传递到
RenderAction