asp.net - 在 MVC 4.0 中的部分 View 中使用节

标签 asp.net .net asp.net-mvc razor asp.net-mvc-4

当我需要在特定元素上初始化 jQuery ui 时,我想在部分 View 中包含脚本。它确实属于部分,而不是包含页面或布局。

据说 MVC 4 中有一种方法可以做到这一点,但我似乎找不到任何相关信息。

最佳答案

我也遇到了类似的问题。希望这可以帮助。 我们希望有一个 View ,其中包含一个显示一些数据的公共(public)标题部分,以及当我们单击页面中的链接时应动态更改的另一个部分。 (类似于选项卡的东西) 由于我们不想多次重新加载标题部分,因此我们决定使用一个容器 View 和一个占位符 div,用于在单击 ajax 链接时动态加载部分 View 。 但是,加载到占位符中的部分 View 包含大量 javascript 代码,我们无法将不同部分 View 使用的所有代码包含到单个 javascript 文件中并从容器 View 中引用它,因为存在一些冲突的函数。 引入命名空间来解决该问题也不是非常有效的方法,因为所有 JavaScript 逻辑仍然会被不必要地加载。 做了一些谷歌搜索让我意识到在部分 View 中包含脚本部分是行不通的。我尝试使用 @RenderSection("partialScripts", required: false) 在 View 中定义一个部分,但未成功,因为 RenderSection 仅适用于布局 View 。 以下是我为解决这个问题而采取的方法。 布局 View 中定义的脚本部分可以包含任何有效的标记。所以我决定有一个 div 来帮助我在容器 View 的脚本部分动态加载脚本。操作链接的 OnSuccess 事件处理程序用于动态附加脚本。 这是我的容器 View 的代码。

<ul>
    <li>
        @Ajax.ActionLink("Partial One", "PartialOne", ajaxOptions: new AjaxOptions
                     {
                         HttpMethod = "Get",
                         InsertionMode = InsertionMode.Replace,
                         UpdateTargetId = "container",
                         OnSuccess = "loadScriptsDynamically('PartialOne')"
                     })
    </li>
    <li>
        @Ajax.ActionLink("Partial Two", "PartialTwo", ajaxOptions: new AjaxOptions
                     {
                         HttpMethod = "Get",
                         InsertionMode = InsertionMode.Replace,
                         UpdateTargetId = "container",
                         OnSuccess = "loadScriptsDynamically('PartialTwo')"
                     })
    </li>
</ul>

<div id="container">
</div>

@section scripts
{
    <script src="@Url.Content("~/Scripts/app/Container.js")"></script>
    <div id="dynamicScripts"
         data-partial-one="@Url.Content("~/Scripts/App/PartialOne.js")"
         data-partial-two="@Url.Content("~/Scripts/App/PartialTwo.js")">
    </div>
}

Controller 类的代码

    public PartialViewResult PartialOne()
    {
        return PartialView("_PartialOne");
    }

    public PartialViewResult PartialTwo()
    {
        return PartialView("_PartialTwo");
    }

Container.js 文件包含将为不同部分 View 动态加载必要脚本的逻辑。

function loadScriptsDynamically(name) {
    var script = document.createElement('script');
    var dynamicScriptsDiv = document.getElementById('dynamicScripts');
    var dynamicScriptDivJQuery = $('#dynamicScripts');
    dynamicScriptDivJQuery.empty();
    if (name === 'PartialOne') {
        script.src = dynamicScriptDivJQuery.data('partial-one');
        dynamicScriptsDiv.appendChild(script);
    } else if (name === 'PartialTwo'){
        script.src = dynamicScriptDivJQuery.data('partial-two');
        dynamicScriptsDiv.appendChild(script);
    }
}

由于某些限制,我们无法使用 jQuery 将脚本元素附加到 div。但是我们可以使用一些老式的 javascript 代码来创建脚本元素并将其附加到dynamicScriptsDiv。请注意,当我们的 MVC 应用程序在 IIS 服务器中运行时,我正在使用一些数据属性来访问之前附加到dynamicScriptsDiv 的脚本路径,并且我们不想对它们进行硬编码。

动态加载脚本后附加到事件是我们的下一个挑战。通过使用立即调用函数,我能够注册所有事件绑定(bind)代码以及我必须使用以下代码执行的任何初始化逻辑。

(function initPartialOne() {
    $('#myButton').click(function() {
        setLabelText();
    });
})();

function setLabelText() {
    $('#myLabel').text('One was clicked');
}

最后是我的部分 View 之一的代码。

<label id="myLabel">[Message]</label>
<input type="button" id="myButton" value="Click me partial one"/>

关于asp.net - 在 MVC 4.0 中的部分 View 中使用节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12430005/

相关文章:

c# - 为什么二进制序列化比 xml 序列化更快?

c# - 想要将图像保存到文件夹并将 url 保存在数据库中

javascript - jQuery/CSS : Div-overlay and not affect positions of other divs

asp.net-mvc - 向 iPhone 发送消息 : PushSharp or SignalR

asp.net - 像 ASP.NET 中的 Smarty 之类的东西?

android - 验证 Android 应用程序调用 Web api 服务

asp.net - 使用 ASP.Net MVC 3 构建一个简单的网站

c# - DataContext 到数据库

c# - .net 类库中的注释

c# - 将字节数组插入 SQL Server 数据库表