我是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;
}
但是我不能让标签显示出来
我希望避免呈现控件,然后应用样式将其隐藏。
我该怎么做呢?
发布于 2012-11-08 13:42:07
我假设下面的代码也在“索引视图”上:
@if (ViewBag.Show)
{
Html.Label("Test");
}
如果是这种情况,则在使用ViewBag.Show = false;
时将覆盖索引视图中的ViewBag.Show
。删除这一行,它将显示您的文本框。
编辑
我刚刚注意到您的" action“返回void--这意味着如果调用此action方法,则不会呈现任何视图。似乎你需要阅读更多关于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,以指示标签是隐藏的还是可见的,也可以使用部分页面更新。
我认为,基于您所拥有的大量零散信息,明智的做法是先从同步页面开始,在进行ASP.NET调用之前先了解Ajax 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的内置机制。
发布于 2012-11-08 13:58:06
尝试这个(不在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")
});
https://stackoverflow.com/questions/13283122
复制相似问题