C# · 12月 26, 2021

c# – 在ASP.NET MVC 3中发布动态表单

在我正在处理的其中一种表单上,如果用户根据所选值选择DropDownList“Type”,我将动态显示一组其他DropDownLists.

例如,类型:汽车,公寓
选择“Car”,将动态添加两个新的DropDownLists“Price”& “模型”.
选择“Building”,将动态添加两个新的DropDownLists“Area”& “地板”

我的问题是如何处理发布到服务器的数据?我通常会收到表单的字段,并自动获得“模型绑定”.但是根据用户的选择在页面上添加的那些动态字段呢?我将如何在Action中检索它们?

谢谢

解决方法 啊误解了这一点.

如果你知道可以添加什么下拉列表,我总是会在你的模型上有一个值.如果没有收到任何内容,MVC会将它们设置为默认值.

编辑:您仍然可以使用控制器以更原始的方式访问表单集合

Request.Form.KeysRequest.QueryString.KeysRequest[“ExpectedDropdownName”]

当然,这些将是您的表单发布的所有值,因此您需要一种方法来识别您的一个下拉菜单,如前缀或其他内容.例如

foreach (var key in Request.Form.AllKeys.Where(k => k.StartsWith(“dynamic-dropdown-“)) { var selectedValue = Request[key]; }

如果您不知道它们将会是什么,我仍然不明白您打算如何处理动态下拉列表,这可能会导致一些问题并使验证完全动态和客户端(不是100%安全).这也可能会带来一些安全问题,但是有一些情况你可以使用它,我会假设你有其中一个.

如果情况并非如此,请不要忘记,因为模型具有属性,所以根本不需要回发.

你可以这样做:

public class MyModel{ [required] public string FirstName { get; set; } public string PossibleDropdown1 { get; set; } public string PossibleDropdown2 { get; set; }}

控制器最好填充模型,但是如果你没有从表单中传回一些字段,它们将只是null并且操作仍然有效.

我还使用父模型的子对象和所有可空的对象实现了更复杂的场景.这需要在模拟视图中围绕ajax调用EditorTemplates进行一些奇特的工作,以确保前缀适合MVC解析,但我不会在这里讨论.