【问题标题】:Convert FormCollection to object of type known only at runtime将 FormCollection 转换为仅在运行时已知的类型的对象
【发布时间】:2015-04-15 12:44:05
【问题描述】:

我的控制器带有包含代码的操作,看起来像

public ActionResult Index(FormCollection data)
{
    var type = findTypeByName(data["CastToTypeName"]);
    var model = transformRequestDataToType(data/* or may be Request*/, type) as DbEntity;
    SaveData(model);
    ...
}

有没有办法将请求数据转换为运行时已知类型的对象? 我使用<form> 将数据发布到控制器并尝试在不将表单数据更改为 json 的情况下找到解决方案。

【问题讨论】:

  • 这看起来很危险。对于(邪恶的)用户来说,这是一种非常方便的方式来修改他们想要的任何数据库数据。
  • 这是一个小站点的管理部分,所以我只是通过为控制器添加身份验证来阻止任何此类可能性。
  • 在我看来,您忘记强制表单类实现接口。如果您希望 MVC 工作,这非常重要。

标签: c# asp.net-mvc formcollection


【解决方案1】:

首先,我将输入名称符号简化为:

a.name
a.items\
a.items/name
a.items/desc
a.items\
a.items/name
a.items/desc

曾经

a.name
a.items.Index
a.items[0].name
a.items[0].desc
a.items.Index
a.items[1].name
a.items[1].desc

接下来我在使用js提交之前提取表单数据,阻止表单提交并将表单数据发送到action表单属性中定义的url的ajax post请求。在服务器端,我解析数据并递归地将其分配给给定类型实例的属性。因此,当设置了 CastToTypeName 值时,我可以 ParseAs<MyType>(Request) 甚至 ParseAsGiven(Request)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多