我可以在.cshtml文件中引用的单独的js文件中访问MVC模型属性吗

时间:2019-03-19 12:35:45

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

我正在研究一个使用模型绑定的MVC项目。我需要在视图页面中引用的javascript文件中访问整个模型。 我尝试在视图页面的script标签内对整个模型进行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页面中的整个模型。如何实现呢?

预先感谢。

2 个答案:

答案 0 :(得分:0)

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>

答案 1 :(得分:-1)

您可以为JavasScript模型创建一个构造函数,然后使用剃刀代码实例化它。

例如:

型号

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攻击(搜索后在Internet上了解更多信息)。最好从控制器返回JSON对象。

修改

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

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

剃刀查看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);
            });
        });