Bil*_*ill 6 c# jquery asp.net-mvc-3
在我正在处理的其中一种表单上,如果用户根据所选值选择DropDownList"Type",我将动态显示一组其他DropDownLists.
例如,类型:汽车,公寓选择"汽车",将动态添加两个新的DropDownLists"价格"和"模型".选择"Building",会动态添加两个新的DropDownLists"Area"和"Floor"
我的问题是如何处理发布到服务器的数据?我通常会收到表单的字段,并自动获得"模型绑定".但是根据用户的选择在页面上添加的那些动态字段呢?我将如何在Action中检索它们?
谢谢
您可以使用FormCollection访问页面上的所有字段.但是,您将丢失自动模型绑定,并且必须遍历表单集合以查找您的值,如下所示:
public ActionResult ActionMethod(FormCollection formCollection)
{
foreach (var key in formCollection.AllKeys)
{
var value = formCollection[key];
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您也可以在模型中包含动态下拉列表.
啊这个理解错了。
如果您知道可以添加哪些下拉菜单,我总是会对您的模型有一个值。如果没有收到任何消息,MVC 会将它们设置为默认值。
编辑:您仍然可以使用控制器以更原始的方式访问表单集合
Request.Form.Keys
Request.QueryString.Keys
Request["ExpectedDropdownName"]
Run Code Online (Sandbox Code Playgroud)
当然,这些将是您的表单发布的所有值,因此您需要一种方法来识别您的下拉列表之一,例如前缀或其他内容。例如
foreach (var key in Request.Form.AllKeys.Where(k => k.StartsWith("dynamic-dropdown-"))
{
var selectedValue = Request[key];
}
Run Code Online (Sandbox Code Playgroud)
我仍然不太明白你打算如何处理动态下拉列表,如果你不知道它们会是什么,这可能会导致一些问题,并使验证完全动态和客户端(不是 100% 安全)。这也可能会带来一些安全问题,但在某些情况下您可能会使用它,我假设您有其中之一。
如果情况并非如此,请不要忘记,仅仅因为模型具有属性,就根本不必将其发回。
你可以这样做:
public class MyModel
{
[Required]
public string FirstName { get; set; }
public string PossibleDropdown1 { get; set; }
public string PossibleDropdown2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器将尽力填充模型,但如果您不从表单传回某些字段,它们将仅为空,并且操作仍然有效。
我还使用父模型的子对象且全部可为空的对象实现了更复杂的场景,例如这样。这需要围绕模拟视图中对 EditorTemplates 的 ajax 调用进行一些奇特的工作,以确保前缀适合 MVC 解析,但我不会在这里讨论这一点。