啊,我误解了这个。
如果您知道可能添加的下拉菜单,我建议在您的模型上始终设置一个值。如果没有收到任何值,MVC将将其设置为默认值。
编辑:您仍然可以以更原始的方式从控制器中访问表单集合
Request.Form.Keys
Request.QueryString.Keys
Request["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; }
}
控制器会尽力填充模型,但如果您没有从表单中传回某些字段,则它们将为空,并且操作仍将正常工作。
我还使用了更复杂的方案,例如使用父模型的子对象以及所有可为空的对象。这需要一些花哨的工作来绕过 AJAX 调用到编辑器模板中的模拟视图,以确保 MVC 解析的前缀是正确的,但我不会在这里详细介绍。