【问题标题】:C# Cast FormData to an ObjectC# 将 FormData 转换为对象
【发布时间】:2018-02-01 20:33:09
【问题描述】:

我正在使用 angularjs 向我的 API 发布一个文件和一个 json 对象。我能够从服务器获取所有数据(文件和模型对象):

public async Task<IHttpActionResult> send()
{
    var path = HttpContext.Current.Server.MapPath("~/uploads");
    var provider = new MultipartFormDataStreamProvider(root);
    var result = await Request.Content.ReadAsMultipartAsync(provider);
    var modelFromClient = result.FormData["model"];
}

我收到的 modelFromClient 格式如下:"model":"{\"name\":\"James\",\"comments\":\"test\"}

但我想将 modelFromClient json 转换为我的用户模型:

public User {
    public string name{ get; set; }   
    public string comments{ get; set; }
}

所以最后,我希望能够像以前通过 url 显式发送对象时那样获取我的属性:

public async Task<IHttpActionResult> add(User user) {

  // here, my user object will have all the values that i set in my client side and i get them like this : 
    user.name;
    user.comments;
    ...// other attributes
    // Save the object in dataBase
    user.Save();
}

希望你能理解我的需要

【问题讨论】:

    标签: c# upload


    【解决方案1】:

    如果您可以控制客户端 json,那么也许您可以省略 model 字段并像这样发送内容:

    {
        "name": "james",
        "comments": "test"
    }
    

    这将允许您“按原样”使用现有的控制器实现。

    但是,如果客户端 json 超出您的控制范围,那么您需要将其反序列化为代表 json 的模型。将您的模型更改为以下可能会起作用:

    public Model
    {
        public User model { get; set; }
    }
    

    因为是从请求中读出原始json,所以可以在直接调用add()之前手动反序列化

    然后你的控制器会变成这个(假设引用了 Json.Net):

    public async Task<IHttpActionResult> send()
    {
        var path = HttpContext.Current.Server.MapPath("~/uploads");
        var provider = new MultipartFormDataStreamProvider(root);
        var result = await Request.Content.ReadAsMultipartAsync(provider);
        var modelFromClient = result.FormData["model"];
    
        var clientModel = JsonConvert.Deserialize<Model>(modelFromClient);
    
        return await add(clientModel.user);
    }
    
    public async Task<IHttpActionResult> add(User user)
    {
        //Do whatever you need with user
    
        //Save the object in database
        user.Save();
    }
    

    【讨论】:

    • 由于我正在上传文件,因此获取数据模型的唯一方法是使用 result.FormData["model"] 并使用函数:public async Task send() without参数。
    • 在手动调用add 之前,我已经更新了答案以包括手动反序列化。
    • 这是一个好的开始!是的,我确实可以控制客户端 json,但是当我将对象附加到表单数据时,我不能省略放置属性: var formData= new FormData();formData.append("model",angular.toJson(data.模型)); formData.append("文件", data.file);也许您还有其他建议来删除“模型”属性?
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2017-05-16
    • 2021-11-25
    • 2021-10-08
    • 1970-01-01
    • 2021-05-19
    • 2016-04-24
    相关资源
    最近更新 更多