【问题标题】:GitHub Tree Slider implementation on MVC3MVC3 上的 GitHub 树滑块实现
【发布时间】:2012-06-14 22:12:40
【问题描述】:

我正在尝试在我的 MVC3 应用程序中实现相同的树形幻灯片,但我不完全确定我做得对:

索引页面:

<script type="text/javascript">
    $(document).ready(function () {
        $('#slider a').click(function () {
            history.pushState({ path: this.path }, '', this.href);
            $.get(this.href, function (data) {
                $('#slider').slideTo(data);
            });
            return false;
        });
    });
</script>

@{Html.RenderAction("MainTableTracker", "Release", new { releaseId = Model });}

MainTableTracker 局部视图:

<script type="text/javascript">
    $(document).ready(function () {
        $('#slider a').click(function () {
            history.pushState({ path: this.path }, '', this.href);
            $.get(this.href, function (data) {
                $('#slider').slideTo(data);
            });
            return false;
        });
    });
</script>

<div id="slider">
    @Html.RouteLink(Model.Brand.Name, "Brand", new { BrandId = Model.Brand.Id }) /
    <ul>
        <li><a href="#">Overview</a></li>
        @foreach(var model in Model.ModelExts)
        {
            <li>@Html.RouteLink(model.Model.Name, new { modelId = model.Model.Id })</li>
        }
    </ul>
</div>

VersionTable 局部视图:

<script type="text/javascript">
    $(document).ready(function () {
        $('#slider a').click(function () {
            history.pushState({ path: this.path }, '', this.href);
            $.get(this.href, function (data) {
                $('#slider').slideTo(data);
            });
            return false;
        });
    });
</script>


<div id="slider">
    @Html.RouteLink(Model.Brand.Name, "Brand", new { BrandId = Model.Brand.Id }) / @Html.RouteLink(Model.Name, "Model", new { modelId = Model.Id }) /
    <ul>
        <li><a href="#">Overview</a></li>
        @foreach(var model in Model.Brand.Model)
        {
            <li>@Html.RouteLink(model.Name, new { modelId = model.Id })</li>
        }
    </ul>

    <div class="versionWraper">
        @foreach(var version in Model.Version)
        {
            <div>
                @version.Name
            </div>
        }
    </div>
</div>

这可行,但是我很确定我做错了,我猜我不应该有 3 个不同的视图每次都复制父视图的代码。

我想知道我是否应该只有一个视图模型和一个动作,让视图决定每次显示什么?但我对只使用一个操作来显示不同类型的数据(发布、品牌和功能)并不满意。

另外,布局有:

 $(window).bind('popstate', function (e) {
        $.get(e.originalEvent.state.path, function (data) {
            $('#slider').slideTo(data);
        });
    });

这行得通,但是当我回到品牌级别时,它会重新加载我的所有脚本(因为它是视图而不是默认脚本的部分)。

有没有更好的实现方式?

谢谢

【问题讨论】:

    标签: jquery asp.net asp.net-mvc-3 github


    【解决方案1】:

    在设计这样的东西时,我建议您不要通过 ID 来定位对象。它使您处于奇怪的情况,例如您所面临的情况,您希望在脚本触发之前保证该项目在页面上以及诸如此类的事情-在处理部分加载等时,这可能是固有的问题。

    请考虑这种方法:

    <style>
        .slider { /* Styles here */ }
        .slider > ul { /* Styles here */ }
        .slider > ul > li { /* Styles here */ }
        .slider > .versionWrapper { /* Styles here */ }
        .slider > .versionWrapper > .versionName { /* Styles here */ }
    </style>
    
    <div class="slider">
        @Html.RouteLink(Model.Brand.Name, "Brand", new { BrandId = Model.Brand.Id })
        / @Html.RouteLink(Model.Name, "Model", new { modelId = Model.Id }) /
        <ul>
         <li><a href="#">Overview</a></li>
    
        @foreach(var model in Model.Brand.Model) {
         <li>@Html.RouteLink(model.Name, new { modelId = model.Id })</li>
        }
    
        </ul>
        <div class="versionWrapper">
    
        @foreach(var version in Model.Version) {
         <div class="versionName">@version.Name</div>
        }
    
        </div>
    </div>
    
    <script type="text/javascript" language="javascript">
    $(document).ready(function () {
        $('.slider > ul > li > a').live('click', function (ev) {
            ev.preventDefault();
            ev.stopPropagation();
    
            var $a = $(ev.target);
            var $slider = $a.closest('.slider');
    
            history.pushState({ path: $a.path }, '', $a.href);
            $.get($a.href, function (data) {
                $slider.slideTo(data);
            });
        });
    });
    </script>
    

    此时,您实际上是针对放置在页面上的任何滑块,无论它包含在哪个部分中 - 最后少量的 jQuery 逻辑可以轻松放入站点范围或页面中 -宽 JS 文件,与输出 HTML 的特定实现分离。

    接下来,只需为您所处的模式创建一个切换开关。我喜欢使用 ViewData["SettingName"] 进行此操作,但这只是我。

    如果您希望显示“MainTable”样式视图,请设置如下内容:

    ViewData["Mode"] = "Default";
    

    如果您希望显示“版本”样式视图,请设置:

    ViewData["Mode"] = "Version";
    

    然后将您的部分更改为:

    <div class="slider">
    @{
        bool versionMode = (ViewData["Mode"] as String == "Version");
    
        string breadCrumb = Html.RouteLink(
            Model.Brand.Name, 
            "Brand", 
            new { BrandId = Model.Brand.Id }
        ).ToString();
    
        if (versionMode) {
            breadCrumb = String.Format("{0} / {1}", 
                breadCrumb, 
                Html.RouteLink(
                    Model.Name, 
                    "Model", 
                    new { modelId = Model.Id }
                ).ToString()
            );
        }
    }
    
        @breadCrumb /
        <ul>
            <li><a href="#">Overview</a></li>
    @{
        if (versionMode)
            foreach(var model in Model.ModelExts) {
    
            <li>@Html.RouteLink(model.Model.Name, new { modelId = model.Model.Id })</li>
    
            }
        } else {
    
            @foreach(var model in Model.Brand.Model) {
                <li>@Html.RouteLink(model.Name, new { modelId = model.Id })</li>
            }
    
        }
    }
        </ul>
    
    @{
        if (versionMode) {
    
        <div class="versionWrapper">
            @foreach(var version in Model.Version) {
            <div>@version.Name</div>
            }
        </div>
    
        }
    }
    
    </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多