【问题标题】:Can i access MVC model properties in a separate js file referenced in the .cshtml file我可以在 .cshtml 文件中引用的单独 js 文件中访问 MVC 模型属性吗
【发布时间】:2019-08-09 23:51:51
【问题描述】:

我正在开发一个使用模型绑定的MVC 项目。我需要访问视图页面中引用的javascript 文件中的整个模型。 我尝试在视图页面的脚本标记内对整个模型进行 JSON 编码。

var model = @Html.Raw(Json.Encode(Model));
    console.log(model);

效果很好。

就我而言,整个脚本必须保留在单独的页面中,即。不在视图页面本身内。如何从该脚本页面访问整个模型?

单个属性可以绑定到隐藏的输入字段,并且可以通过其id从js中访问该值即:

<input type="hidden" id="modelObject" value="@model.property")/>
 var model = $("#modelObject").val();

我需要 js 页面中的整个模型。这怎么可能实现?

提前致谢。

【问题讨论】:

  • 我的回答对你有用吗?
  • 查看script元素的src属性。

标签: jquery asp.net asp.net-mvc model-view-controller model-binding


【解决方案1】:

Razor 模板输出文本,通常可以是内容类型为 text/html 的“页面”(html/css/js)。但您可以根据需要提供其他内容类型,例如 text/javascript。

首先,创建一个带有ActionName 属性的控制器动作:

public class ScriptsController {
    [ActionName("model.js")]
    public ActionResult ModelJs() {
        var model = new Object();  // your actual model here.
        return View();
    }
}

然后你创建你的视图,就像你当前页面中的script标签:

var model = @Html.Raw(Json.Encode(Model));

确保从当前页面中删除脚本元素。

然后在你的页面中引用新的js视图:

<script type="text/javascript" src="@Url.Action("model.js", "Scripts")"></script>

【讨论】:

  • 最好从控制器返回 Json,而不是在视图中使用 .Raw 和 Encode 转换为 Json
  • 必须始终定义“更好”。
  • 我总是很犹豫是否要使用 Html.Raw,因为它会在视图中呈现未编码的数据,当然你已经用 Json.Encode 覆盖了这一点,但为什么不在服务器上进行编码并将纯 Json 传递给客户端,这对我来说似乎是一个更好的关注点分离,并且它还确保开发人员不会在您同意根本不使用 Html.Raw 时不正确/不安全地使用它。
  • 我认为这两种方法都可以正常工作。从控制器返回 json 非常简单。如果您需要自定义返回的内容,则从视图返回 json 非常棒。例如,向文件中添加一些函数,或将 json 封装在一个函数中。无论哪种方式,我最不同意的是,仅仅因为某些东西有可能被滥用,人们就认为根本不应该使用它。危险的东西要适当使用,不能滥用。但Html.Raw 有目的和可接受的用途。
【解决方案2】:

您可以为您的 JavaScript 模型创建一个构造函数,然后使用 razor 代码对其进行实例化。

例如:

型号

public class Car{
    public string Brand { get; set; }
    public string Fuel { get; set; }
}

模块模式中的Javascript文件,但你也可以使用其他东西:

var car = (function(jsonModel){
    var runs = "My " + jsonModel.Brand + " runs on " + jsonModel.Fuel;
    return {
        Runs : runs
    }
    });

剃刀视图

@model Car

<!--load the javascript file somewhere-->

<script type="text/javascript">
    $(function(){
        var myFord = new car(@Html.Raw(Json.Encode(@Model)) );
            alert(myFord.Runs);
        });
</script>

.NET fiddle我无法添加外部 javascript 文件,但您可能明白了

虽然我应该说不建议使用@Html.Raw,因为它会使您容易受到 XSS 攻击(搜索后在互联网上阅读更多内容)。最好从控制器返回 JSON 对象。

编辑

这是一个如何在 .Net fiddle 上使用 JsonResult 的示例 控制器

    [HttpGet]
    public JsonResult Car()
    {
        return Json(new Car("ford","gasoline"), JsonRequestBehavior.AllowGet);
    }

razor 查看 JS 以获取 json 结果并实例化您的 JS 模块

$(function(){
            var model = $.ajax({
                url: "@Url.Action("Car","Home")",
                dataType: 'json',
                contentType: 'application/json; charset=utf-8',
            }).done(function(response){
                console.log(response);
                var myFord = new car(response);
                alert(myFord.Runs);
            });
        });

【讨论】:

  • 这个答案没有解决 OP 的问题。
  • 我认为确实如此,当我读到它时,OP 希望将整个模型发送到 JS 文件,正如我提到的我无法引用单独的文件,这就是 JavaScript 内联的原因Razor 视图,但您当然可以将其放在单独的文件中,然后从视图中包含该文件
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多