当我发布包含下拉列表的表单时,我收到 RequestBindingException 。此外,服务器返回HTTP 400 Bad Request以及以下POST数据:
Address1:address1
Address2:address2
City:city
County:County
Countries:GB
PostalCode:test123
我不确定我做错了什么。是否可以尝试在ViewModel的构造函数中分配Countries / SelectedCountry属性?如果是这样,我应该如何为这些属性分配初始值/默认值?
或者使用我的ViewModel作为端点参数是不是一个坏主意(它应该是一个单独的dto吗?)
我的ViewModel如下所示:
public class AddressDetailsViewModel
{
public AddressDetailsViewModel()
{
Countries = new List<SelectListItem>
{
new SelectListItem
{
Selected = true,
Text = "United Kingdom",
Value = "GB"
}
};
SelectedCountry = new List<SelectListItem>
{
new SelectListItem
{
Selected = true,
Text = "United Kingdom",
Value = "GB"
}
};
}
...
}
我正在使用Html Helper创建下拉列表:
<li>
@Html.LabelFor(x => x.Countries)
@Html.DropDownListFor(x => x.Countries, Model.SelectedCountry)
</li>
我的服务端点(不会被点击)看起来像:
public object Post(AddressDetailsViewModel data)
{
...
}
答案 0 :(得分:1)
简短的回答是建议不要将ViewModel用作端点参数,而是设计一个单独的DTO来表示要发送到服务器的message。如果您创建一个干净的消息DTO,它代表您在请求中需要的确切字段,并且请求中的每个字段都具有简单的get / set属性,那么应该更容易将其连接起来并使路由在ServiceStack中工作。 / p>
将视图模型重用为请求消息有一些缺陷:
更具体地说,您获得RequestBindingException
的实际原因可能是由于几个因素造成的,例如Countries
类中AddressDetailsViewModel
属性/字段的声明方式,与声明HTML表单的方式相比,如何为此请求定义路由,等等。在视图模型的构造函数中初始化数据与您看到的400错误无关;我发现这是初始化DTO默认值的好方法。没有看到更多代码就很难分辨。
我建议为POST请求设计一个更简单的DTO类,它只具有服务器真正需要的数据所需的属性。并使用更简单的数据类型 - 字符串和整数而不是SelectListItems或SelectListItems列表。这只会使请求复杂化,并可能涉及您所看到的400错误。