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

Bil*_*ill 6 c# jquery asp.net-mvc-3

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

例如,类型:汽车,公寓选择"汽车",将动态添加两个新的DropDownLists"价格"和"模型".选择"Building",会动态添加两个新的DropDownLists"Area"和"Floor"

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

谢谢

Mar*_*ark 8

您可以使用FormCollection访问页面上的所有字段.但是,您将丢失自动模型绑定,并且必须遍历表单集合以查找您的值,如下所示:

public ActionResult ActionMethod(FormCollection formCollection)
{
    foreach (var key in formCollection.AllKeys)
    {
        var value = formCollection[key];
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以在模型中包含动态下拉列表.


Gat*_*ats 2

啊这个理解错了。

如果您知道可以添加哪些下拉菜单,我总是会对您的模型有一个值。如果没有收到任何消息,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 解析,但我不会在这里讨论这一点。