Использовать модель представления в Javascript

1

Сценарий:

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

В настоящее время я использую javascript inline, так что можно использовать значение в модели, но что, если javascript будет перемещен в отдельный файл. В этом случае, как мне получить эти значения.

Код

@model IEnumerable<BookSpec.DomainEntities.ContactModel.ContactDataModel>
<label for="SpecFinder">Contact</label>
<select id="SpecFinder" name="state">
@foreach (var name in Model)
{
    <option value="@name.GroupID">@name.GroupName</option>
}
</select>

<script type="text/javascript">
    $(document).ready(function () {
        $("#SpecFinder").change(function(){
            getData(this.value,'@Model.ProductID');
        });
    })
</script>

Это мой текущий пример кода выглядит, и я хочу полностью переместить встроенный javascript в отдельный файл. Как я могу это сделать, мне также нужны значения из модели.

  • 1
    Добавьте его в атрибут data-productid элемента
  • 0
    @StephenMuecke, спасибо за ответ, это нормально для одного или двух, в некоторых случаях мне нужно использовать, как и все свойства в модели, в этом случае это не будет осуществимо, верно? но это то, что я думал изначально.
Теги:
asp.net-mvc

2 ответа

3

Объявите глобальную model переменных javascript, как показано ниже. Тогда вы можете использовать его в любом месте.

<script type="text/javascript">
    var model = @Html.Raw(Json.Encode(Model));
</script>

Я рекомендую использовать вышеуказанное решение. Но если вы все же не хотите включать какой-либо скрипт в частичный вид, вы можете отобразить model внутри любого скрытого div. И получить доступ к его тексту и преобразовать его в object с помощью JSON.parse как JSON.parse ниже. Код, как показано ниже, не является хорошей практикой и похожей на работу патча.

HTML

<div id="model" style="display:none;">
    @Html.Raw(Json.Encode(Model))
</div>

скрипт

var model = JSON.parse($("#model").text());
  • 0
    Спасибо @Karan, есть ли способ не использовать JavaScript в частичном представлении?
  • 2
    @RanjithVaradan Я думаю, что Каран попросил вас объявить это глобально (где будет включено ваше частичное представление), чтобы ваш JS мог получить к нему доступ, потому что он находится в глобальной области видимости. Вы также можете назначить объект модели для объекта window
Показать ещё 2 комментария
0

Я думаю, что ответ Karan - хороший вариант. Но если вы не хотите встроенного Javascript, вы можете присвоить свою модель скрытому вводу HTML и затем извлечь значение в любой другой внешний JS файл, который вы хотите.

С чем-то вроде Html.Hidden, например:

@Html.Hidden("myModel", new Microsoft.Web.Mvc.MvcSerializer().Serialize(model, SerializationMode.Signed));

Вы можете выбрать другой режим сериализации в перечислении SerializationMode.

(Код не пробовал, но должен быть близок)

  • 2
    Вы не можете назначить сложный объект скрытому вводу (если вы не должны были его сериализовать)
  • 0
    Спасибо @StephenMuecke. Сложный объект должен быть сериализован (ответ отредактирован).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню