从这篇文章here开始,我要做的是获取aspnet / html表单发送的键值对,然后将它们放入dto中,然后我可以在我的应用程序中的其他地方使用它。我在foreach循环中看到了
public async Task<HttpResponseMessage> PostFormData()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
try
{
await Request.Content.ReadAsMultipartAsync(provider);
// Show all the key-value pairs.
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
Trace.WriteLine(string.Format("{0}: {1}", key, val));
}
}
您可以阅读这些值并将其发送到traceline。从那里你怎么会把他们变成dto?
继续链接中的示例。我想要
public class trip{
public string triptype {get; set;}
public string airports{get; set;}
DateTime? dates {get; set;}
}
答案 0 :(得分:1)
我发现你现在已经找到了解决方法,但是使用Web API中内置的默认模型绑定功能,可以采用更简单的方法。
public async Task<HttpResponseMessage> PostFormData(Trip tr)
{
//do whatever you want here, you've already got a Trip object fully-formed (assuming the data is valid - the first thing you do you should be to check that):
if (!ModelState.IsValid) {
//return an error to the client
return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState);
}
//otherwise, carry on and do whatever processing you need
///...
//last thing to do, return a response, something like:
return Request.CreateResponse(HttpStatusCode.OK, "Your request has been processed");
}
为此,唯一的要求是“Trip”对象的属性名称与从表单提交的名称相匹配。根据你在答案中给出的属性名称来判断,你只需要稍微修改一下Trip对象:
public class Trip {
public string trip { get; set; }
public string options { get; set; }
public string seat { get; set; }
}
如果您不想这样做,请执行相反的操作:修改您提交的HTML表单的“name”属性,以便它们与Trip对象的属性名称匹配。
就是这样 - 无需从表单数据中手动填充对象属性。
答案 1 :(得分:0)
如果有人对如何做到这一点感兴趣我发现对我有用的方式就是这个。我不知道这是不是最好的方法。我知道,由于接收这样的值通常不常用,答案不明确。
var tr = new Trip
{
Triptype = provider.FormData.GetValues("trip").FirstOrDefault(),
Options = provider.FormData.GetValues("options").FirstOrDefault(),
Seat = provider.FormData.GetValues("seat").FirstOrDefault(),
};