angular js post无法序列化对象

wkyowqbh  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(256)

目前,我正在向我的控制器发送angularjs帖子,而不是提交表单。我有一个名为sharinginfo的对象,在post调用之后,该对象在控制器中总是设置为null。我认为json序列化程序存在问题。
在angular中,我是这样发布数据的

$scope["TemplateForm"].$setPristine();
                    var model = getFormData($('#TemplateForm'));

                    model.Publish = publish;
                    model["Template.CommitteeWithAccessCanEditReusable"] = $scope.Model.Template.CommitteeWithAccessCanEditReusable;
                    model["Template.SharingInfo"]  = angular.toJson($scope.Model.Template.SharingInfo);
                    $http({
                        method: "POST",
                        url: "/Template/UpdateTemplateContent",
                        data: model
                    }).then...morecode=>

在调试器中,template.sharinginfo被序列化为

"{"CommitteesWithAccess":[{"TenantId":32727,"DisplayName":"20190304 Ted Test Committee","IsStatic":false,"RootCommitteeId":null}]""{"CommitteesWithAccess":[{"TenantId":32727,"DisplayName":"20190304 Ted Test Committee","IsStatic":false,"RootCommitteeId":null}]"

当数据到达控制器时,调试器总是将值设置为null。此外,对于string或boolean类型的对象,我可以设置值。我相信它只是没有序列化到对象中,所以我决定序列化sharinginfo,看看它期望什么。为此,我添加了一个字符串类型的伪sharinginfo变量。此变量保留json字符串,然后在控制器中对其进行反序列化。此解决方案不可维护,因为它强制我定义两个名称相同但类型不同的变量,并且我无法更改sharinginfo对象。
我的控制器方法定义如下:templatedto.sharinginfo是字符串,templatedto.template.sharinginfo是对象

[AcceptVerbs(HttpVerbs.Post)]
        [RequireReusablesPermissions]
        public ActionResult UpdateTemplateContent(SaveTemplateDto templateDto)
        {

            if (templateDto.SharingInfo != null && templateDto.Template.SharingInfo != null)
            {
                templateDto.Template.SharingInfo = JsonConvert.DeserializeObject<ReusableDto.SharingState>(templateDto.SharingInfo) as ReusableDto.SharingState;
            }
            //just to see what this gives me tbd
            var serializedObject = JsonConvert.SerializeObject(templateDto.Template.SharingInfo);

            var validationResults = TemplateValidator.GetValidationErrors(templateDto);

            if (validationResults?.Any() == true)
            {
                return new AjaxResult<ReusableDto>
                {
                    ResponseResultCode = ResponseResultCode.Failure,
                    MessagesHeader = $"{Resources.UnableToSaveTemplate} {string.Join(",", validationResults)}"
                };
            }

“serializedobject”返回以下字符串:

"{\"CommitteesWithAccess\":[{\"TenantId\":32727,\"DisplayName\":\"20190304 Ted Test Committee\",\"IsStatic\":false,\"RootCommitteeId\":null}]}"

正如您可以看到angular.tojson和c#json序列化程序一样,对对象进行不同的序列化。我如何让它在angular中进行预期的序列化?
我的对象定义如下,仅供参考。reuasabledto是一个模板

public class SaveTemplateDto
        {
            public ReusableDto Template { get; set; }
            public bool IsNewTemplate => Template?.Id == Guid.Empty;

            // Model binding properties 
            public bool Publish { get; set; }
            public string SharingInfo { get; set; }
        }

 public class ReusableDto
    {
        public SharingState SharingInfo { get; set; }

        public class TenantDto
        {
            public short TenantId { get; set; }
            public string DisplayName { get; set; }
            public bool IsStatic { get; set; }
            public string RootCommitteeId { get; set; }
        }

        public class SharingState 
        {
            public List<TenantDto> CommitteesWithAccess { get; set; }
            public List<TenantDto> CommitteesWithoutAccess { get; set; }            
        }
ttp71kqs

ttp71kqs1#

可能创建一个 Package 器对象

public class CommitteesWithAccessModel
{
    public SaveTemplateDto  SaveTemplateDto  {get; set;}
}

[AcceptVerbs(HttpVerbs.Post)]
[RequireReusablesPermissions]
public ActionResult UpdateTemplateContent(CommitteesWithAccessModel templateDto)
{
...
}

相关问题