通过 Javascript 访问视图模型元素

Accessing a view model element through Javascript

我正在将一个名为 HomeViewModel 的模型传递到我的视图。 HomeViewModel 有一个名为 isNext 的 bool 属性。在我看来,我只是想显示 isNext 值。所以基本上我有这个:

@model Impoware.Models.HomeViewModel

@{
    ViewBag.Title = "View Contest";
}

<h2>View Current Contest</h2>

@using (Html.BeginForm())
{
    <table>
        <tr>
            <td>@Html.LabelFor(m => m.isNext)</td>
            <td></td>
            <td align="right">Submenu goes here</td>
        </tr>
    </table>
}

在同一个视图中,我有一个简单的 div onclick 调用 setIsNext(true)。本质上,我想根据单击 <div> 的内容将 isNext 的值设置为 true/false,但似乎 javascript 找不到 elemntbyId('isNext') (alert('2')永远不会被调用)。有什么想法吗?

<script>
    var setIsNext = function(input){
        alert(input);
        var output = document.getElementById('isNext');

        if (output != null) {
            output.innerHTML = input;
            alert('2');
        }
    }
</script>

您需要在视图文件中指定 ID

// 在 cshtml 中

@Html.LabelFor(m => m.isNext, new { id = "MyNextId" })


var output = document.getElementById('MyNextId');

LabelFor 将为您的 属性 名称呈现标签,而不是 属性 的值。如果你想设置它的值以便在提交表单时更新的值可用,你应该使用输入字段。如果您不喜欢显示可见的输入字段,您可以考虑使用隐藏字段。

@using (Html.BeginForm())
{
    <table>
        <tr>
            <td> @Html.HiddenFor(f=>f.isNext)</td>                
            <td align="right">Submenu goes here</td>
        </tr>
    </table>
    <div class="myDiv" data-val="true">Yes</div>
    <div class="myDiv" data-val="false">No</div>
}

并且你可以读取点击按钮的data-val属性值并将其设置为隐藏输入。

$(function () {

    $(".myDiv").click(function(e) {
            $("#isNext").val($(this).data("val"));
    });

});

此外,如果您希望在 UI 中为布尔值 属性 设置一个复选框,并希望根据 div 点击更新其值,您可以这样做这个。

@using (Html.BeginForm())
{
   @Html.CheckBoxFor(f=>f.isNext)
   <div class="myDiv" data-val="true">Yes</div>
   <div class="myDiv" data-val="false">No</div>
}

点击 div 时,您还需要更新选中状态

$(function () {

    $(".myDiv") .click(function (e) {
            var v = $(this).data("val");
            $("input[name='isNext']").val(v);
            $("#isNext").attr("checked", v);;
        });

});