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

Posted

技术标签:

【中文标题】在 ASP.NET MVC 3 中发布动态表单【英文标题】:Posting Dynamic Forms in ASP.NET MVC 3 【发布时间】:2012-03-26 12:05:31 【问题描述】:

在我正在处理的一个表单上,如果用户选择 DropDownList“类型”,基于所选值,我将动态显示一组其他 DropDownList。

例如,类型:汽车、公寓 选择“汽车”,将动态添加两个新的下拉列表“价格”和“型号”。 选择“Building”,将动态添加两个新的 DropDownLists“Area”和“Floor”

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

谢谢

【问题讨论】:

@COLDTOLD 这是一个服务器端问题,ajax 不是一个会产生任何影响的解决方案 @Marek Karbarz 您可以通过使用 ajax 添加新项目来刷新部分页面 【参考方案1】:

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

public ActionResult ActionMethod(FormCollection formCollection)

    foreach (var key in formCollection.AllKeys)
    
        var value = formCollection[key];
    

当然,您也可以只在模型中包含动态下拉菜单。

【讨论】:

【参考方案2】:

啊,误会了。

如果您知道可以添加哪些下拉菜单,我将始终对您的模型有价值。如果没有收到任何内容,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; 

控制器将尽最大努力填充模型,但如果您不从表单传回某些字段,它们将只是 null 并且操作仍然有效。

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

【讨论】:

问题是,DropDowns 是动态的,无法事先知道 DropDowns 会出现什么!但是有一个问题,如果我将没有 DropDowns 的 ViewModel 设置为 Action 的输入,有没有办法在 Action 方法的主体内访问 FormsCollection?

以上是关于在 ASP.NET MVC 3 中发布动态表单的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.Net Web 表单/MVC 中动态加载和添加字段

在 asp .NET MVC 中提交表单之前动态地将项目添加到列表中

ASP.NET MVC & JQuery 动态表单内容

ASP.NET MVC3 - 将项目动态添加到对象的数组中

Wordpress 类似于 ASP.NET MVC2/3 或 ASP.NET 4.0 中的动态永久链接

如何在 ASP.NET MVC 中使用多个表单元素