在javascript asp .net mvc razor中访问模型

时间:2014-01-27 20:51:27

标签: jquery asp.net-mvc razor

我正在使用razor开发asp .net mvc项目。

我试图在javascript中访问我的模型,如下所示

alert(Model.SecurityProfile);
alert(model.SecurityProfile);
alert(@Model.SecurityProfile);
alert(@model.SecurityProfile);

var SecurityProfileViewModel = { ViewModel: model, Id: SecurityProfileId, ProfileId: $('#ProfileId').val(), JobTitleId: $('#JobTitle').val(), SecurityProfileTypeId: $('#SecurityProfileType').val(), Status: $('#ddlStatus').val(), Reason: $('#txtReason').val(), Mode: $('#hidMode').val() };

    $.ajax({
        url: '/SecurityProfile/Edit',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        data: JSON.stringify(SecurityProfileViewModel),
        success: function (data) {
            alert(data);
            window.location.href = '/SecurityProfile/Index';

        }
    });

但没有任何作用。我得到的模型是未定义的错误

2 个答案:

答案 0 :(得分:46)

就JavaScript而言,

model是未定义的。视图中的服务器端代码执行服务器端。 JavaScript没有这个概念。它只关注该代码的客户端输出。您可以种类混合两者,但需要记住,服务器端组件只是发出字符串,这将成为客户端输出的一部分。

因此,例如,如果您的模型上有一个名为:

的属性
Model.SomeProperty

然后你不能在这样的JavaScript中直接使用它:

alert(Model.SomeProperty)
// or
alert(SomeProperty)

这不是使用剃刀视图语法告诉视图引擎这里有服务器端代码。这是语法上的客户端代码,没有Model客户端。因此,您需要指出要执行的服务器端预处理:

alert(@Model.SomeProperty)

此外,如果SomeProperty是一个字符串,请记住它的输出不会包含引号。因此,您还需要为客户端代码提供这些代码:

alert('@Model.SomeProperty')

因此,当SomeProperty呈现给客户端时,它将在此处发出服务器端值"Hello World"。因此,如果值类似于alert('Hello World') ,则生成的客户端代码将为:

{{1}}

最重要的是要记住服务器端代码和客户端代码之间的分离。就服务器端代码而言,所有JavaScript / HTML / CSS只是一个大字符串。该视图基本上只是创建一个发送到浏览器的大字符串。一旦它进入浏览器,客户端渲染就会知道JavaScript / HTML / CSS之间的区别并在服务器端代码消失很久之后相应地执行。

答案 1 :(得分:0)

您可以将 cshtml 中的 Model 序列化为 js 变量,以便稍后通过 javascript 访问它

<script>
    var data = @Html.Raw(Json.Serialize(@Model));
</script>