【问题标题】:Checkbox (model) dosn't change value when checked复选框(模型)在选中时不会改变值
【发布时间】:2014-04-22 21:48:50
【问题描述】:

我在视图中制作了一些复选框。复选框是通过具有 bool 属性的 ViewModel 实现的。我目前正在尝试将控制器中的查询更改为“日期”或“月份”,具体取决于复选框是否已选中。然而,在控制器中,即使“月份”已被选中,它也总是会跳过“else 语句”。月份总是 False。

我怀疑 JavaScript 代码可能有误。

此用户界面:

在我的控制器方法中,我尝试执行以下操作:

控制器:

 var request = GoogleAnalyticsService.Data.Ga.Get("ga:59380223", start, end, "ga:visitors");



    var request = GoogleAnalyticsService.Data.Ga.Get("ga:59380223", start, end, "ga:visitors");


            if (model.Month)
            {

                request.Dimensions = "ga:month";
                request.Sort = "-ga:month";

            }

            else
            {
                request.Dimensions = "ga:date";
                request.Sort = "-ga:date";
            }

            request.MaxResults = 10000;

            Google.Apis.Analytics.v3.Data.GaData d = request.Execute();

在视图中,我实现了我的 Viewmodel 并尝试编写一些 javascript 检查是否选中了哪些复选框以及是否返回 true 或 false:

查看:

    <table class="adminContent">
             <tr>
                <td class="adminTitle">
                    @Html.NopLabelFor(model => model.StartDate): 
                </td>
                <td class="adminData">
                    @Html.EditorFor(model => model.StartDate)
                </td>
            </tr>
            <tr>
                <td class="adminTitle">
                    @Html.NopLabelFor(model => model.EndDate):
                </td>
                <td class="adminData">
                    @Html.EditorFor(model => model.EndDate)
                </td>
            </tr>
          <tr>
            <td class="data" colspan="2">
                @Html.CheckBoxFor(model => model.Date, new { id = "Day" }) // -- Checkbox Date
                @Html.LabelFor(model => model.Date)
            </td>
            </tr>
         <tr>
             <tr>
        <td class="data" colspan="2">
                @Html.CheckBox("chkMonth", new { @onclick = "updatemyhidden(this)" }) // -- Checkbox Month
                @Html.HiddenFor(model => model.Month, new { id = "Month" })
                @Html.LabelFor(model => model.Month)           
        </td>
    </tr>
        </tr>
            <tr>
                <td class="adminTitle">
                    @Html.NopLabelFor(model => model.GAStatisticsId ):
                </td>
                <td class="adminData">
                    @Html.DropDownList("GAStatisticsId", Model.AvailableGAStatistics)
                    <input type="button" id="GAStatisticsReport-Submit" class="t-button" value="@T("Admin.Common.Search")" />
            </tr>
    </table>


    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript" src="/Scripts/jquery.min.js"></script>
    <script type="text/javascript">
 $("#GAStatisticsReport-Submit").click(function () {

        if ($("select[name='GAStatisticsId'] option:selected").text() == "Visitors Report")
            drawChartVisitors()

        if ($("select[name='GAStatisticsId'] option:selected").text() == "Orders Report")
            drawChartOrders()

        if ($("select[name='GAStatisticsId'] option:selected").text() == "Conversion Report")
            drawConversion()

        function updatemyhidden(chkbox) {
            $("#Month").val(chkbox.checked);

        }

    })
    google.load("visualization", "1", { packages: ["corechart"] });
    google.load("visualization", "1", { packages: ["treemap"] });
    function drawChartVisitors() {
        $.get('/GAStatistics/GetVisitors', {
            StartDate: $('#@Html.FieldIdFor(model => model.StartDate)').val(),
            EndDate: $('#@Html.FieldIdFor(model => model.EndDate)').val(),



        },
            function (data) {
                var tdata = new google.visualization.DataTable();

                tdata.addColumn('date', 'Date');
                tdata.addColumn('number', 'Visitors');

                for (var i = 0; i < data.length; i++) {


                    if ($("#Month").is(":checked")) {


                        var dateStr = data[i].Date.substr(0, 4);
                    }



                    else {

                        var dateStr = data[i].Date.substr(0, 4) + "-" + data[i].Date.substr(4, 2) + "-" + data[i].Date.substr(6, 2);
                    }


                    tdata.addRow([new Date(dateStr), parseInt(data[i].Visitors)]);
                }

控制器中的 if 语句似乎根据我在视图中选择的内容进行操作。

注意:我不使用 httpPost/get,因为数据是通过 Google 图表加载的,我不希望每次选择新请求时都重新加载整个页面。

【问题讨论】:

    标签: c# javascript jquery asp.net-mvc razor


    【解决方案1】:

    是因为您在月份设置了 bool 字段,因此它将为您的复选框呈现为 true/false。您可以查看为month 复选框呈现的 HTML。无论您是否选中,数据仍然以true/false 发送回服务器,这取决于呈现页面时设置的内容。这个值永远不会改变。

    所以我建议您在视图模型中再添加一个属性以继续尝试check/unchecked 状态,并在视图中将其呈现为隐藏字段,并在复选框为ticked/unticked 时更新此隐藏字段。

    或者month字段呈现为隐藏字段并在页面中添加一个复选框以更新month字段当复选框为checked/unchecked

    假设我们使用第二种方法,代码看起来像这样,(我没有测试下面的代码)。我希望这会有所帮助:

    @Html.CheckBox("chkMonth", new { @onclick = "updatemyhidden(this)" })
    @Html.HiddenFor(model => model.Month)
    
    <script type="text/javascript">
        function updatemyhidden(chkbox) {
            $("#Month").val(chkbox.checked);
    
        }
    </script>
    

    【讨论】:

    • Okej。你的意思是像“bool MonthChecked = true”和“bool Month Unchecked = False”。这将导致视图中出现 2 个复选框 - “model.MonthChecked”和“model.MonthUnchecked”。你是这个意思吗?应该隐藏哪一个?谢谢
    • - 谢谢我还更新了我的帖子,试图缩小代码并让 Month 首先工作。但是月份似乎没有得到验证,并且在控制器中它总是跳转到 else 语句并将日期添加到请求中。我已将验证代码移至 button.click,以便在单击按钮后进行验证,此后我仍然有 if/else stamenets 检查复选框是否已被选中并返回月份或日期字符串格式,但它不会工作.我一定是做错了什么?
    • 你是说隐藏字段(月)还没更新?您可以使用提琴手检查发送回服务器的值吗?或者您可以从 firebug 或 google chrome 控制台进行检查,以确保在点击提交按钮之前它已在隐藏字段中更新
    猜你喜欢
    • 2012-03-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多