Передача данных модели во внешний javascript - PullRequest
4 голосов
/ 13 декабря 2010

Есть ли способ передать данные модели во внешний javascript без скрытых переменных в моем представлении.Я использую карту Google для отображения кнопок, и карта загружается с помощью javascript, и в то же время у меня есть (большой) список информации о широте и долготе как часть данных моей модели, которые выбираются во время моего запроса.Я не хочу иметь длинный список скрытых переменных в моем html, а также сократить еще один ajax-вызов на сервер для получения необходимой информации (широта / долгота) в моем javascript.Есть ли способ сделать это эффективно?

Спасибо.

1 Ответ

1 голос
/ 12 июня 2012

Краткий ответ - «нет».

Если вам необходимо вернуть необработанную модель данных вместе с вашим представлением, единственный вариант - вставить данные в представление.Два варианта:

В элементе HTML (что-то вроде неудобного IMO):

<div id="myData" data-model="{&quot;Name&quot;: &quot;Jason&quot;}"></div>

В скрипте:

<script>
  var myData = {Name: Jason};
</script>

Я предпочитаю второй метод, поскольку тамHTML не ускользает

Я согласен, что это немного раздражает, но один запрос - это один запрос ... это всего лишь один поток данных.Загрузочные данные таким способом довольно распространены, поэтому, возможно, в будущей версии MVC будет более чистый способ их возврата (но, вероятно, это будет выглядеть как один из моих примеров выше).

Вне этого, какВы упомянули, что вы можете сделать дополнительный запрос, чтобы получить только модель в ответе JSON.

РЕДАКТИРОВАТЬ:

У меня был HtmlHelper в рукаве, чтобы помочь с этим...

public static MvcHtmlString ToScriptVariable<T, TMember>(this T value, Expression<Func<T, TMember>> expression) where T : class 
{
    var member = expression.Body as MemberExpression;
    if (member == null)
        throw new ArgumentException("Expression must be a member expression.", "expression");

    var expressionValue = expression.Compile()(value);
    var serializer = new JavaScriptSerializer();
    var seralizedData = serializer.Serialize(expressionValue);

    var tag = new TagBuilder("script");
    tag.Attributes.Add("type", "text/javascript");
    tag.InnerHtml = String.Format(CultureInfo.InvariantCulture, "var {0} = {1};", member.Member.Name, seralizedData);

    return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}

Использование:

<%: Html.ToScriptVariable(x => Model.MyData) %>

Результат:

<script type="text/javascript">var MyData = "(whatever)"</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...