首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否有一种简单的方法将表单从ASP.NET MVC转发到ASP.NET API?

是否有一种简单的方法将表单从ASP.NET MVC转发到ASP.NET API?
EN

Stack Overflow用户
提问于 2021-12-10 07:02:52
回答 2查看 132关注 0票数 0

假设我有这样一个ViewModel,它来自于ASP.NET MVC中的表单提交:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class EditProfileViewModel
{
    public string DisplayName { get; set; }
    public IFormFile Photo { get; set; }
}

我可以很容易地在控制器内接收到这个信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public async Task<IActionResult> OnPost([FromForm] EditProfileViewModel edits)
{
    // edits contains form data, great
}

但是现在我想把它转发到后端API,也使用ASP.NET,包括文件上传。最简单的方法似乎是使用HttpClient创建一个新的表单POST,使用MultipartFormDataContent。但据我所知,虽然从表单内容到模型类的转换是在接收请求时透明地进行的,但是创建MultipartFormDataContent需要对键值对进行硬编码。

我知道这样做是有可能的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var form = new MultipartFormDataContent()
form.Add(new StringContent(edits.DisplayName), "displayName")
var content = new StreamContent(edits.Photo.OpenReadStream());
content.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType)
form.Add(content, "photo") // Is this the right capitalization ?? See how error prone this is?

var result = await client.PostAsync("some-api", form);

但这是冗长的,容易出现重复声明的错误。此外,要在接收端使用相同的模型类反序列化,需要了解转换魔术。

是否有更好的方法将模型类转换回MultipartFormDataContent?或者,如果这是XY问题,那么将此表单模型完全转发到后端ASP.NET API的更好方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2021-12-10 07:09:59

需要了解转换魔术。

这就是要点-- MultipartFormDataContent可以用来向任何web应用程序发布表单,而且代码不知道底层解析的魔力,因为需要告诉接收端如何期望它的格式。

一个web框架可以区分大小写,而另一个则需要小写或完全匹配的大小写.或者对于数组,可以支持字段名的重复(name="foo"name="foo",.)另一个可能需要[]后缀(name="foo[]"name="foo[]",.)还有一个可能需要指数(name="foo[0]"name="foo[1]",.)。

更不用说多个层次的属性:name="foo.bar"name="foo_bar",.

因此,您必须编写自己的属性到字段名称映射代码,知道您发布到哪个框架。

票数 0
EN

Stack Overflow用户

发布于 2021-12-10 07:42:26

我用一些扩展方法和反射解决了“键值对的硬编码”问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static class MultiContentExtensionMethods
    {
        public static void AddDto<TDto>(this MultipartFormDataContent multiContent, TDto dto)
        {
            List<PropertyInfo> propertyInfos = dto.GetType().GetProperties().ToList();

            foreach(var propertyInfo in propertyInfos)
            {
                if (propertyInfo.PropertyType != typeof(IFormFile) &&
                   !propertyInfo.PropertyType.Name.Contains("List")) 
                {
                    if(propertyInfo.GetValue(dto) is not null)
                        multiContent.Add(new StringContent(propertyInfo.GetValue(dto).ToString()), propertyInfo.Name);
                }
                else if(propertyInfo.PropertyType != typeof(IFormFile) &&
                    propertyInfo.PropertyType.Name.Contains("List"))
                {
                    var list = (IList)propertyInfo.GetValue(dto, null);

                    if(list is not null)
                    foreach (var item in list) 
                    {
                        multiContent.Add(new StringContent(item.ToString()), propertyInfo.Name);
                    }
                }
            }
        }


       public static void AddFile(this MultipartFormDataContent multiContent, IFormFile file, string name)
       {
            byte[] data;
            using (var br = new BinaryReader(file.OpenReadStream()))
            {
                data = br.ReadBytes((int)file.OpenReadStream().Length);
            }

            ByteArrayContent bytes = new(data);

            multiContent.Add(bytes, name, file.FileName);
        }
    }

用法:

在本例中,ViewModel和Dto之间没有区别,因此可以使用ViewModel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class EditProfileDto
{
    public string DisplayName { get; set; }
    public IFormFile Photo { get; set; }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EditProfileDto dto = new()
{
    DisplayName = edits.DisplayName
};

MultipartFormDataContent form = new();
form.AddDto(dto);
form.AddFile(edits.Photo, nameof(dto.Photo));

var result = await client.PostAsync("some-api", form);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70306462

复制
相关文章
ASP.NET MVC Web API
实际开发中,我们可以轻松的使用 WebAPI 配合 Routing 路由和 EF 框架来轻松的实现一个 RESTful 的 API 并将其作为软件的后端。
李郑
2019/12/04
1.3K0
ASP.NET MVC 超简单 分页
C# public ActionResult BiaoDan(int? page) { int pageindex = 1;
liulun
2022/05/09
2.1K0
asp.net MVC简单图片上传
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162895.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/15
4K0
ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC
我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身。在某些情况下通过这两者的结合往往可以解决很多特殊数据的呈现问题,我
蒋金楠
2018/01/15
4.8K0
ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC
ASP.NET MVC 上传文件方法
,在完成MVC项目的过程中,经常会涉及到上传文件,而且更多的是上传图片,需要上传一张或多张图片到网页上,这个时候就要一个上传文件的方法.下面就讲解如何编写一个上传文件的方法:
全栈程序员站长
2022/09/15
4.1K0
ASP.NET MVC 上传文件方法
ASP.NET MVC 4 - 测试驱动 ASP.NET MVC
测试驱动 ASP.NET MVC Keith Burnell 下载代码示例 模型-视图-控制器 (MVC) 模式的核心是将 UI 功能划分成三个组成部分。模型表示您的领域的数据和行为。视图管理模型的显示并且处理与用户的交互。控制器协调视图和模型之间的交互。通过这样将本质上就难于测试的 UI 逻辑与业务逻辑分离开来,使得使用 MVC 模式实现的应用程序非常易于测试。在本文中,我将论述用于增强您的 ASP.NET MVC 应用程序的可测试性的最佳做法和技术,包括如何建立您的解决方案的结构、设计代码架构以便处理依
张善友
2018/01/22
5.4K0
ASP.NET MVC 4 - 测试驱动 ASP.NET MVC
ASP.NET MVC-api增删改查
接着在models文件夹添加实体数据模型,引入EF数据库,具体方法参考我之前的EF文章。
全栈程序员站长
2022/09/15
5010
ASP.NET MVC-api增删改查
ASP.NET MVC 4 Beta:强化Web API
ASP.NET MVC 4 Beta 新功能特性: (1) ASP.NET Web API (2) 添加移动项目模板 (3) 对移动 app 特性的功能支持,JQuery Moblie,View Switcher and Browser Overriding (4) 提升自定义代码产生器 (5) 增强异步方法,异步产生器提供返回参数支持 Task 实例。 (6) 单页面应用程序的支持 (7) 增强默认模板功能。 (8) 更好的支持 Windows Azure SDK (9) 改进 Razo
张善友
2018/01/29
7700
ASP.NET Core MVC中构建Web API
在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能。 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文
码农阿宇
2018/04/18
8300
ASP.NET Core MVC中构建Web API
ASP.NET MVC4 Web API 堆栈将添加指定消息处理功能
微软工程师Kiran Challa近日在其博客中张贴了一张正在开发阶段的ASP.NET MVC4 Web API堆栈图,如下图所示。 Kiran称,目前该堆栈正在开发阶段,上面的这张图并不能代表最终
张善友
2018/01/22
8070
ASP.NET MVC4 Web API 堆栈将添加指定消息处理功能
从 MVC 到使用 ASP.NET Core 6.0 的Minimal API
https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/
郑子铭
2021/11/10
7.7K0
ASP.NET MVC ETag & Cache等优化方法
最近有一个项目是用SmartAdmin + Jquery + EasyUI 一个ASP.NET MVC5的项目,一直存在一个性能问题,加载速度比较慢,第一次加载需要(在没有cache的情况下)需要4-5秒完成全部的加载.
阿新
2021/12/24
8410
ASP.NET MVC ETag & Cache等优化方法
ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)
本章节主要针对Web API进行基础教学以及强化训练,并对跨域操作做出详细的介绍与添加跨域配置信息,可以通过本文学会创建【跨域接口的编写】,风格采用【restfull】风格
红目香薰
2022/11/29
1.8K0
ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)
ASP.NET MVC Section
本篇文章我们来讨论一下ASP.NET MVC框架中的Section。 Section主要用于将一部分代码插入到 Layout页面中的指定位置。通俗地说就是,我们先在 Layout页面中通过@RenderSection("Header")的方式挖一个坑,告诉下面的视图页面说,我这个地方有个坑,你们把你们各自相关的代码放进来吧。然后,使用该Layout的视图页面通过如下的方式将一坨坨的代码送到Layout的坑中。
全栈程序员站长
2022/09/15
7590
ASP.NET MVC升级到ASP.NET Core MVC踩坑小结
ASP.NET Core是微软新推出的支持跨平台、高性能、开源的开发框架,它的优势不必多说,因为已经说得太多了。当然,现在依然有着数量庞大的系统运行于.NET Framework上,由于有大量的Break Changes,很多项目项目团队也不敢贸然升级,其中的考量也不全部是技术原因,更多的可能还是业务推进因素。
AI.NET 极客圈
2020/05/18
2.4K0
ASP.NET MVC的Action Filter
一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter。Action Filter作为一个可以应用到Controller Action(或者是整个controller)上的属性(Attribute),改变Action执行的行为,当应用于整个Controller上时,Controller上的所有Action都应用了同样设置的Action。 使用Action Filter 可以处理缓存、 验证和错误处理您的
张善友
2018/01/22
1.8K0
ASP.NET MVC的Action Filter
WebSocket在ASP.NET MVC4中的简单实现
WebSocket 规范的目标是在浏览器中实现和服务器端双向通信。双向通信可以拓展浏览器上的应用类型,例如实时的数据推送、游戏、聊天等。有了WebSocket,我们就可以通过持久的浏览器和服务器的连接实现实时的数据通信,再也不用傻傻地使用连绵不绝的请求和常轮询的机制了,费时费力,当然WebSocket也不是完美的,当然,WebSocket还需要浏览器的支持,目前IE的版本必须在10以上才支持WebSocket,Chrome Safari的最新版本当然也都支持。本节简单介绍一个在服务器端和浏览器端实现WebS
小白哥哥
2018/03/07
2.6K0
WebSocket在ASP.NET MVC4中的简单实现
ASP.NET Core MVC 概述
ASP.NET Core MVC 是使用“模型-视图-控制器”设计模式构建 Web 应用和 API 的丰富框架。 什么是 MVC 模式? 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成 3
程序你好
2018/07/20
6.5K0
ASP.NET MVC HtmlHelper类
ASP.NET MVC之 HtmlHelper 在ASP.NET MVC项目的开发中,一般会默认使用Razor视图来进行View层的编写,从而实现高效率的C#/HTML代码的混写。 示例 诸如下述代码
李郑
2018/03/01
1.9K0
ASP.NET MVC HtmlHelper类
ASP.NET MVC使用javascript
@if (IsSectionDefined(“SubMenu”)) { @RenderSection(“SubMenu”, required: false) }
全栈程序员站长
2022/09/15
8410

相似问题

ASP.NET MVC --是否有一种简单的方法将数据缓存添加到我的服务层?

25

是否有一种使用ASP.NET MVC创建静态网站的方法?

10

是否有一种方法来确定ASP.Net MVC捆绑之前是否呈现?

31

是否有一种在ASP.NET中使用ASP.NET的安全方法?

14

将asp.net mvc webapi方法转换为asp.net mvc方法

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文