Я разработчик Java, новичок в .NET. Я работаю над проектом .NET MVC2, где я хочу иметь частичное представление, чтобы обернуть виджет. Каждый объект виджета JavaScript имеет объект данных JSON, который будет заполнен данными модели. Затем методы для обновления этих данных привязываются к событиям, когда данные изменяются в виджете или если эти данные изменяются в другом виджете.
Код выглядит примерно так:
MyController
:
virtual public ActionResult DisplaySomeWidget(int id) {
SomeModelView returnData = someDataMapper.getbyid(1);
return View(myview, returnData);
}
myview.ascx
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModelView>" %>
<script type="text/javascript">
//creates base widget object;
var thisWidgetName = new Widget();
thisWidgetName.updateTable = function() {
// UpdatesData
};
$(document).ready(function () {
thisWidgetName.data = <% converttoJSON(model) %>
$(document).bind('DATA_CHANGED', thisWidgetName.updateTable());
});
</script>
<div><%:model.name%></div>
Чего я не знаю, так это как отправить данные, а SomeModelView
затем использовать их для заполнения виджета, а также преобразовать их в JSON. Я видел несколько действительно простых способов сделать это в контроллере, но не в представлении. Я полагаю, что это основной вопрос, но я уже несколько часов пытаюсь сделать это замечательно.
источник
Ответы:
В mvc3 с бритвой,
@Html.Raw(Json.Encode(object))
кажется, добиваются цели .источник
Json.Serialize
вместо Encode.Отлично, вы только начали использовать MVC и обнаружили первый серьезный недостаток.
Вы действительно не хотите преобразовывать его в JSON в представлении, и вы действительно не хотите преобразовывать его в контроллере, поскольку ни одно из этих мест не имеет смысла. К сожалению, вы застряли в этой ситуации.
Лучшее, что я нашел, это отправил JSON в представление в ViewModel, например так:
затем используйте
по вашему мнению. Имейте в виду, что стандартный .NET JavaScriptSerializer довольно дерьмо.
выполнение этого в контроллере, по крайней мере, делает его тестируемым (хотя не совсем так, как описано выше - вы, вероятно, захотите взять ISerializer в качестве зависимости, чтобы вы могли его посмеяться)
Обновите также, что касается вашего JavaScript, было бы неплохо обернуть ВСЕ виджеты JS, которые у вас есть выше, примерно так:
таким образом, если вы поместите несколько виджетов на страницу, вы не получите конфликтов (если только вам не нужен доступ к методам из других мест на странице, но в этом случае вы все равно должны зарегистрировать виджет с некоторой структурой виджетов). Сейчас это может не быть проблемой, но было бы неплохо добавить скобки сейчас, чтобы сэкономить время, когда это станет требованием, а также хорошей практикой ОО для инкапсуляции функциональности.
источник
JavaScriptSerializer
илиReturn Json(object)
оба используют те же сериализаторы. Кроме того, отправка того же JSON обратно на контроллер перестроит объект для вас, если вы определите правильную модель. Может быть, во время MVC2 это было серьезным недостатком ... но сегодня это бриз и очень удобно. Вы должны обновить свой ответ, чтобы отразить это.Я нашел, что было бы неплохо сделать это так (использование в представлении):
Вот соответствующий класс Extension вспомогательного метода:
Он не суперсложен, но он решает проблему того, где его разместить (в контроллере или в поле зрения?). Ответ очевиден: ни;)
источник
Вы можете использовать
Json
из действия напрямую,Ваше действие будет примерно таким:
редактировать
Просто увидел, что вы предполагаете, что это представление,
Model
поэтому вышеприведенное не совсем правильно, вам нужно сделатьAjax
вызов метода контроллера, чтобы получить это,ascx
тогда у вас не будет модели как таковой, я оставлю свой код на всякий случай, если это будет полезно для вас, и вы можете изменить вызовEdit 2 просто вставьте идентификатор в код
источник
@ Html.Raw (Json.Encode (object)) можно использовать для преобразования модального объекта View в JSON
источник
Продолжая отличный ответ от Дейва . Вы можете создать простой HtmlHelper .
И по вашему мнению:
Таким образом, вы можете централизовать логику для создания JSON, если по какой-то причине вы захотите изменить логику позже.
источник
См. Https://highspeedlowdrag.wordpress.com/2014/08/23/mvc-data-to-jquery-data/
Я сделал ниже, и это работает как шарм.
<input id="hdnElement" class="hdnElement" type="hidden" value='@Html.Raw(Json.Encode(Model))'>
источник
У Эндрю был отличный отклик, но я хотел немного его настроить. Отличие заключается в том, что мне нравится, что мои ModelViews не содержат служебных данных. Просто данные для объекта. Кажется, что ViewData подходит для накладных расходов, но, конечно, я новичок в этом. Я предлагаю сделать что-то подобное.
контроллер
Посмотреть
Это делает для вас то, что вы получаете те же данные в вашем JSON, что и в ModelView, так что вы можете вернуть JSON обратно в контроллер, и он будет иметь все части. Это похоже на простой запрос через JSONRequest, однако для этого требуется на один вызов меньше, что экономит ваши накладные расходы. Кстати, это забавно для Даты, но это похоже на другой поток.
источник