微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对复杂对象使用[FromQuery]

如何解决对复杂对象使用[FromQuery]

当我在传递查询字符串时向API端点发送请求时,我的参数没有绑定的问题,如果我扁平化“提交”,则参数绑定,但这不是我想要的解决方案。当第三方控件处理请求时,我无法提供发送请求的客户端代码

我提供了与请求一起发送的查询字符串的示例,该示例在开发人员工具中可以看到,但是Person和Property返回为null。有没有人有任何建议,特别是我可以用来绑定此复杂对象的服务器端更改?谢谢。

public class Submission {
    public Person Person {get; set; }
    public Property Property { get; set; }
}

public class Person {
   public int Age { get; set; }
}

public class Property {
   public string Address { get; set; }
}

Query string parameters

'Person[Age]': 18
'Property[Address]': test

 [HttpGet("action")]
 public async Task<IActionResult> Submit([FromQuery] Submission model)
 {

 }

解决方法

在这种情况下,您要调用的URL是:

https://localhost:.../.../action?Person.Age=18&Property.Address=test
,

更改操作:

private void Setup()
{
    var personViews = personRepository.GetAll().Select( p => new PersonViewModel( p ) ).ToList();

    var bl = new BindingList<PersonViewModel>( personViews );
    bl.AllowEdit = true;
    bl.AllowNew = true;
    bl.AllowRemove = true;
    bl.RaiseListChangedEvents = true;

    this.AutoValidate = AutoValidate.EnableAllowFocusChange;

    dataGridViewPersons.AllowUserToAddRows = true;
    dataGridViewPersons.AllowUserToDeleteRows = true;
    dataGridViewPersons.AllowUserToOrderColumns = true;
    dataGridViewPersons.AllowUserToResizeColumns = true;
    dataGridViewPersons.AllowUserToResizeRows = true;
    dataGridViewPersons.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    dataGridViewPersons.CausesValidation = true;
    dataGridViewPersons.AutoGenerateColumns = true;

    dataGridViewPersons.DataSource = new BindingSource( bl,null );

    if( dataGridViewPersons.Columns[ nameof( PersonViewModel.Age ) ] is DataGridViewTextBoxColumn numberColumn )
    {
        numberColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        //numberColumn.DefaultCellStyle.Format = "N0"; // Integer with 0 decimal places
        //numberColumn.DefaultCellStyle.NullValue = 13;
        //numberColumn.DefaultCellStyle.DataSourceNullValue = 14;
        numberColumn.ValueType = typeof( int );
    }
    else
    {
        throw new Exception();
    }


    dataGridViewPersons.CellValueChanged += ( s,e ) => {
        var dgv = dataGridViewPersons;
        var row = dgv.Rows[ e.RowIndex ];
        var cell = dgv[ e.ColumnIndex,e.RowIndex ];

        if( dgv.CurrentRow.Index == dgv.Columns[ nameof( PersonViewModel.Age ) ].Index )
        {
        }
    };

    dataGridViewPersons.Validating += ( s,e ) => {
        ;
    };

    dataGridViewPersons.CellValidating += ( s,e.RowIndex ];

        if( dgv.CurrentRow.Index == dgv.Columns[ nameof( PersonViewModel.Age ) ].Index )
        {
        }
    };

    dataGridViewPersons.CellEndEdit += ( s,e.RowIndex ];

        if( e.ColumnIndex == dgv.Columns[ nameof( PersonViewModel.Age ) ].Index )
        {
        }
    };

    dataGridViewPersons.CellFormatting += ( s,e.RowIndex ];

        if( e.ColumnIndex == dgv.Columns[ nameof( PersonViewModel.Age ) ].Index )
        {
            if( cell.Value is string str && str.Any( x => !char.IsNumber( x ) ) )
            {

            }
        }
    };
}

为您的提交模型尝试此操作

[HttpGet("Submit")]
 public async Task<IActionResult> Submit([FromQuery] Submission model)
 {

 }

在这种情况下,您必须调用以下URL:

https:// localhost:... / ... / submit?Age = 18&Address = myaddress

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。