我正在尝试在我的 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 部分 View :
<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 部分 View :
<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 个不同的 View 每次都复制父 View 的代码。
我想知道是否应该只有一个 View 模型和一个操作,并让 View 决定每次显示什么?但我不太高兴只使用一种操作来显示不同类型的数据(发布、品牌和功能)。
此外,布局还有:
$(window).bind('popstate', function (e) {
$.get(e.originalEvent.state.path, function (data) {
$('#slider').slideTo(data);
});
});
这可行,但是当我返回品牌级别时,它将重新加载我的所有脚本(因为它是一个 View ,而不是默认脚本的部分)。
有没有更好的方法来实现这个?
谢谢
最佳答案
在设计这样的东西时,我建议您不要通过 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>
此时,您可以有效地定位放置在页面上的任何 slider ,无论它包含在哪个部分中 - 并且最后的少量 jQuery 逻辑可以轻松地放入站点范围或页面中 -宽 JS 文件,与输出 HTML 的特定实现分离。
接下来,只需为您所处的模式创建一个切换。我喜欢使用 ViewData["SettingName"]
执行此操作,但这只是我的想法。
如果您希望显示“MainTable”样式 View ,请设置如下内容:
ViewData["Mode"] = "Default";
如果您希望显示“版本”样式 View ,请设置:
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>
关于jquery - MVC3 上的 GitHub 树 slider 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11042079/