MVC Control.Visible

时间:2012-11-08 05:38:27

标签: jquery asp.net-mvc show-hide

我是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;
    }

但是我无法看到标签显示

我想避免渲染控件然后应用样式来隐藏它

我该怎么做?

2 个答案:

答案 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")
  });