c# - MVC 将 post 参数传递给字典

标签 c# asp.net-mvc

我有一个返回 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"}}

我之前的解决方案适用于 QuerystringHttpGet而不是 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. 选项 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. 选项 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/

相关文章:

c# - 使用 C# Windows 窗体应用程序中的登录详细信息获取登录用户的全名

c# - Windows Phone 8 上的特殊字符与 StreamReader

javascript - 如何绕过绑定(bind)的 Javascript OnChange 函数

C#:为什么是 'bool' 而不是 'boolean'

c# - Watin & IE9 - 无法点击确定按钮

c# - 防止复选框被选中(而不是简单地取消选中)

c# - 如何使用 iText7 从 C# 中的 MemoryStream 创建 Image 对象?

asp.net-mvc - 将 ASP.NET MVC NHibernate 应用程序部署到 IIS7 时出错

c# - 从 MVC View 模型保存重新排序的列表项

c# - .NET 中 ActiveX 的替代品