/// <summary> /// Populates the view model from the data received from the request. /// </summary> /// <returns></returns> public void PopulateViewModel(IDotvvmRequestContext context, string serializedPostData) { // get properties var data = context.ReceivedViewModelJson = JObject.Parse(serializedPostData); var viewModelToken = (JObject)data["viewModel"]; // load CSRF token context.CsrfToken = viewModelToken["$csrfToken"].Value <string>(); ViewModelJsonConverter viewModelConverter; if (viewModelToken["$encryptedValues"] != null) { // load encrypted values var encryptedValuesString = viewModelToken["$encryptedValues"].Value <string>(); viewModelConverter = new ViewModelJsonConverter(context.IsPostBack, viewModelMapper, JObject.Parse(viewModelProtector.Unprotect(encryptedValuesString, context))); } else { viewModelConverter = new ViewModelJsonConverter(context.IsPostBack, viewModelMapper); } // get validation path context.ModelState.ValidationTargetPath = data["validationTargetPath"].Value <string>(); // populate the ViewModel var serializer = CreateJsonSerializer(); serializer.Converters.Add(viewModelConverter); try { viewModelConverter.Populate(viewModelToken, serializer, context.ViewModel); } catch (Exception ex) { throw new Exception($"Could not deserialize viewModel of type { context.ViewModel.GetType().Name }. {GeneralViewModelRecommendations}", ex); } }
/// <summary> /// Populates the view model from the data received from the request. /// </summary> /// <returns></returns> public void PopulateViewModel(DotvvmRequestContext context, string serializedPostData) { // get properties var data = context.ReceivedViewModelJson = JObject.Parse(serializedPostData); var viewModelToken = (JObject)data["viewModel"]; // load CSRF token context.CsrfToken = viewModelToken["$csrfToken"].Value <string>(); ViewModelJsonConverter viewModelConverter; if (viewModelToken["$encryptedValues"] != null) { // load encrypted values var encryptedValuesString = viewModelToken["$encryptedValues"].Value <string>(); viewModelConverter = new ViewModelJsonConverter(context.IsPostBack, JObject.Parse(viewModelProtector.Unprotect(encryptedValuesString, context))); } else { viewModelConverter = new ViewModelJsonConverter(context.IsPostBack); } // get validation path context.ModelState.ValidationTargetPath = data["validationTargetPath"].Value <string>(); // populate the ViewModel var serializer = CreateJsonSerializer(); serializer.Converters.Add(viewModelConverter); viewModelConverter.Populate(viewModelToken, serializer, context.ViewModel); }
/// <summary> /// Populates the view model from the data received from the request. /// </summary> /// <returns></returns> public void PopulateViewModel(IDotvvmRequestContext context, string serializedPostData) { // get properties var data = context.ReceivedViewModelJson = JObject.Parse(serializedPostData); JObject viewModelToken; if (data["viewModelCacheId"] != null) { if (!context.Configuration.ExperimentalFeatures.ServerSideViewModelCache.IsEnabledForRoute(context.Route.RouteName)) { throw new InvalidOperationException("The server-side viewmodel caching is not enabled for the current route!"); } viewModelToken = viewModelServerCache.TryRestoreViewModel(context, (string)data["viewModelCacheId"], (JObject)data["viewModelDiff"]); data["viewModel"] = viewModelToken; } else { viewModelToken = (JObject)data["viewModel"]; } // load CSRF token context.CsrfToken = viewModelToken["$csrfToken"]?.Value <string>(); ViewModelJsonConverter viewModelConverter; if (viewModelToken["$encryptedValues"] != null) { // load encrypted values var encryptedValuesString = viewModelToken["$encryptedValues"].Value <string>(); viewModelConverter = new ViewModelJsonConverter(context.IsPostBack, viewModelMapper, context.Services, JObject.Parse(viewModelProtector.Unprotect(encryptedValuesString, context))); } else { viewModelConverter = new ViewModelJsonConverter(context.IsPostBack, viewModelMapper, context.Services); } // get validation path context.ModelState.ValidationTargetPath = data.SelectToken("additionalData.validationTargetPath")?.Value <string>(); // populate the ViewModel var serializer = CreateJsonSerializer(); serializer.Converters.Add(viewModelConverter); try { viewModelConverter.Populate(viewModelToken.CreateReader(), serializer, context.ViewModel); } catch (Exception ex) { throw new Exception($"Could not deserialize viewModel of type { context.ViewModel.GetType().Name }. {GeneralViewModelRecommendations}", ex); } }