我是mvc的新手,我希望在jquery ajax调用后显示/隐藏html控件。
在ASP.NET中很简单,就像设置Label.Visible = false。
我有一个像这样的剃刀视图:
@if (ViewBag.Show)
{
Html.Label("Test");
}
<input id="idClick" type="button" value="Click"/>
和一个带有jquery的脚本来调用一个动作
$("#idClick").click(function() {
$.ajax({
url: '/Test/ShowLabel',
type: 'GET',
dataType: 'json'
}
});
在我的索引视图中,我设置了:
ViewBag.Show = false;
在行动中:
public void ShowLabel()
{
ViewBag.Show = true;
}
但是我无法看到标签显示
我想避免渲染控件然后应用样式来隐藏它
我该怎么做?
答案 0 :(得分:2)
我假设以下代码也在所谓的“索引视图”上:
@if (ViewBag.Show)
{
Html.Label("Test");
}
如果是这种情况,则在使用ViewBag.Show
时,您将在索引视图中覆盖ViewBag.Show = false;
。删除该行,它将显示您的文本框。
修改强>
我刚注意到你的“动作”正在返回void - 意味着如果调用此动作方法,则不会呈现视图。您似乎需要阅读有关ASP.NET MVC如何工作的更多内容,或者重新解释您的问题。
如果未在索引操作方法中设置ViewBag.Show = true;
(或者使用任何一个创建视图),则ViewBag.Show将默认为false。确保将变量设置为实际调用的位置,并且不要在视图中覆盖它。
修改2
为了响应您的修改,请勿使用ViewBag
来隐藏您的控件。相反,只需将匿名类型传递给HTML帮助程序:
Html.Label("Test", new { style = "display: none;" })
或改为使用CSS类:
Html.Label("Test", new { @class = "some-class-with-display-none" })
编辑3
您的问题非常难以理解,我发现您正在尝试使用Ajax将ViewBag
发回给该页面。你不能这样做。 ViewBag
是仅服务器端的“包”,仅用于初始呈现页面。您可以从操作方法返回Json / Xml,以指示标签是隐藏还是可见,或者使用部分页面更新。
我认为根据您所拥有的分散信息量,首先从同步页面开始,然后在抛出Ajax调用之前了解ASP.NET MVC的工作原理可能是明智的。
编辑4
您似乎希望能够根据Ajax调用的结果更改标签的可见性。由于ViewBag
在用户已经呈现页面时不会改变,因此您需要通过JSON,XML或部分页面刷新将结果返回到页面。最简单的是返回一些JSON:
public JsonResult ShowLabel ()
{
return Json (new { result = true }, JsonRequestBehavior.AllowGet);
}
然后在标签上添加ID:
<label id="testLabel" style="display: none">Test</label>
然后进行Ajax调用:
$.ajax({
url: '/Test/ShowLabel'
type: 'GET',
dataType: 'json'
}).success(function (d) {
if (d.result) {
$('#testLabel').show();
}
});
最终修改
由于我认为您希望将其用于验证,因此您可以避免使用Remote Validation的内置机制。
答案 1 :(得分:0)
尝试此操作(不在ViewBag
中设置任何内容)
注意:强> 如果ajax调用仅用于设置标签的可见性,则可以安全地摆脱ajax调用。
<label for="Test" style="display:none;"></label>
$("#idClick").click(function() {
$.ajax({
url: '/Test/ShowLabel',
type: 'GET',
dataType: 'json'
}
});
$("label[for='Test']").css("display", "block")
});