Могу ли я получить доступ к свойствам модели MVC в отдельном файле js, указанном в файле .cshtml - PullRequest
1 голос
/ 19 марта 2019

Я работаю над проектом MVC, в котором используется привязка модели.Мне нужно получить доступ ко всей модели в файле javascript, на который есть ссылки на странице просмотра.Я попробовал JSON-кодирование всей модели внутри тега скрипта на странице просмотра.

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

, который работает нормально.

В моем случае весь сценарий должен оставаться на отдельной странице, т.е.Не внутри самой страницы просмотра.Как я могу получить доступ ко всей модели со страницы этого скрипта?

Одно свойство может быть связано со скрытым полем ввода, и значение может быть доступно из js по его идентификатору, т.е.:

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

Мне нужна вся модель на странице js.Как этого можно достичь?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Шаблоны Razor выводят текст, который обычно может быть «страницей» (html / css / js), обслуживаемой с типом содержимого text / html.Но вы можете использовать другие типы контента, такие как текст / javascript, если хотите.

Сначала создайте действие контроллера, украшенное атрибутом ActionName:

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

Затем создайтеview, который похож на ваш script тег на текущей странице:

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

убедитесь, что вы удалили элемент script со своей текущей страницы.

Затем обратитесь к новому представлению js вВаша страница:

<script type="text/javascript" src="@Url.Action("model.js", "Scripts")"></script>
0 голосов
/ 19 марта 2019

Вы можете создать конструктор для вашей модели 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
    }
    });

Razor view

@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 из вашего контроллера.

Редактировать

Вот пример того, как использовать JsonResult на .Net fiddle Контроллер * * тысяча двадцать-шести

    [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);
            });
        });
...