我对 MVC 4 和 Ajax 有几个问题。
我的观点非常基本:
<div id="sName">
@Html.Partial("PartialName", Model)
</div>
<script type="text/javascript">
$(function () {
$("select").selectpicker({ style: 'btn', menuStyle: 'dropdown' }); // I use a Bootstrap mod
});
</script>
这是我的部分观点:
@using (Ajax.BeginForm("UpdateProfile", "Account", new { form = "name" }, new AjaxOptions { UpdateTargetId = "sName", OnSuccess = "NameUpdated", HttpMethod = "POST" }))
{
<span>Name</span>
<div id="field-name">
<a id="edit-name" href="#" title="Click here to update your name">@Model.User.Firstname @Model.User.Middlename @Model.User.Surname</a>
</div>
<div id="field-edit-name" style="display: none;">
<input type="text" name="firstname" value="@Model.User.Firstname" />
<input type="text" name="middlename" value="@Model.User.Middlename" /></div>
<input type="text" name="surname" value="@Model.User.Surname" />
<button>Save</button>
<button id="cancel-name">Cancel</button>
</div>
<script type="text/javascript">
$(function () {
$("select").selectpicker({ style: 'btn', menuStyle: 'dropdown' });
$("#edit-name, #cancel-name").on('click', function (e) {
e.preventDefault();
$("#field-edit-name").slideToggle(450);
$("#field-name").slideToggle(450);
})
function NameUpdated() {
$("#field-edit-name").slideToggle(450);
$("#field-name").slideToggle(450);
}
</script>
}
这是我的帐户控制器:
public ActionResult Index()
{
MyModel Model = new MyModel();
return View(Model);
}
[HttpPost]
public ActionResult UpdateProfile(string form, FormCollection c)
{
switch (form)
{
case "name":
// Update name and Model
return PartialView("PartialName", Model);
case "email":
// Update email and Model
return PartialView("PartialEmail", Model);
case "address":
// Update address and Model
return PartialView("PartialAddress", Model);
default :
break;
}
return View();
}
第一个问题是:我正在调用 JQuery 函数“$("select").selectpicker({ style: 'btn', menuStyle: 'dropdown' });” 在视图中,因为我将使用许多 Bootstrap 选择(都在不同的部分视图中),并且只将它放在一个地方是有意义的。但是,我发现在上面的部分视图中的 Ajax 回发之后,Bootstrap 样式丢失并且选择元素恢复为标准浏览器选择。为了解决这个问题,我有
$(function () {
$("select").selectpicker({ style: 'btn', menuStyle: 'dropdown' });
在局部视图中也是如此。这并不理想,那么有没有更好的方法在 Ajax 回发后保持选择样式为 Bootstrap 而无需重复代码?
第二个问题是:当用户点击 id="edit-name" 的链接时,id="field-name" 的 div 滑出,表单字段(在 id="field-edit-name 的 div 内") 滑入。这很好用。但是,当单击保存按钮时,我希望表单字段滑回并滑出链接。我认为 Ajax 选项 OnSuccess="NameUpdated" 会做到这一点,但似乎 Ajax 回发正在刷新部分视图(使字段突然消失并且链接重新出现,好像页面已被刷新)。我知道 Ajax 正在正常工作,因为页面上的滚动位置没有丢失。我究竟做错了什么?
我在布局页面中引用了以下 JS 文件:
<script src="/common/js/jquery-1.8.3.min.js"></script>
<script src="/common/js/jquery.ui.touch-punch.min.js"></script>
<script src="/common/js/bootstrap.min.js"></script>
<script src="/common/js/bootstrap-select.js"></script>
<script src="/common/js/bootstrap-switch.js"></script>
<script src="/common/js/jquery.tagsinput.js"></script>
<script src="/common/js/jquery.placeholder.js"></script>
<script src="/common/js/bootstrap-typeahead.js"></script>
<script src="/common/js/jquery.stacktable.js"></script>
<script src="/common/js/jquery.unobtrusive-ajax.min.js"></script>
谢谢。