我有一个返回 ResultObjekt
的 MVC 应用程序处理完 FormulaData
目的。这是一个通过 HTTP-Post 调用的 rest API
[HttpPost]
[ActionName("GetResult")]
public ResultObjekt GetResult([FromBody]FormularData values)
{
}
问题:有没有办法从 values
中读取所有属性?进入 Dictionary<string, string>
或 IEnumerable<KeyValuePair<string, string>>
?
例如
public class FormularData
{
public string Item1 { get; set; }
public string Item2 { get; set; }
}
结果应该是 Dictionary<string,string>()
或 IEnumerable<KeyValuePair<string, string>>
具有值 { {"Item1","Value1"}, {"Item2","Value2"}}
我之前的解决方案适用于 Querystring
和 HttpGet
而不是 HttpPost
自从我改变了,Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value)
不再工作了。
这是我当前的 - 不太漂亮的解决方案:
[HttpPost]
[ActionName("GetResult")]
public ResultObjekt GetResult([FromBody]FormularData values)
{
List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
if (!string.IsNullOrEmpty(values.Item1))
{
list.Add(new KeyValuePair<string, string>("Item1", values.Item1));
}
if (!string.IsNullOrEmpty(values.Item2))
{
list.Add(new KeyValuePair<string, string>("Item2", values.Item2));
}
IEnumerable<KeyValuePair<string, string>> result = list.AsEnumerable();
}
最佳答案
正如许多人在评论中提到的那样,理想情况下应该使用可以保存表单值的模型。根据我的意见,这也是最简洁的方式,因为我发现它更有条理。
如果您需要同时访问两者,请尽可能先尝试重构/重组代码。在我看来,考虑到表单数据是模型数据的子集,为什么还要尝试访问已经绑定(bind)到我们模型的原始表单数据。
如果重构/重组是不可能的,并且您需要访问两者,那么有几种方法可以做到这一点。
选项 1:使用
FormCollection
:[HttpPost] public ResultObjekt GetResult(FormCollection formCol, FormularData model) { //Note that here both FormCollection and FormularData are used. //To get values from FormCollection use something like below: var item1 = formCol.Get("Item1"); }
选项 2:使用
Request.Form
:[HttpPost] public ResultObjekt GetResult(FormularData model) { //To get values from Form use something like below: var formData = Request.Form; var item1 = formData.Get("Item1"); }
希望这对您有所帮助。
更新:正如 Lali 所指出的那样,无论您使用 FormCollection
还是 Request.Form
,您都可以将其转换为字典:formData.AllKeys.ToDictionary(k => k, v => formData [v])
(未经测试),因为两者都是 NameValueCollection
关于c# - MVC 将 post 参数传递给字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41937460/