Posting Dynamic Forms in ASP.NET MVC 3

本文关键字:NET MVC ASP in Dynamic Forms Posting | 更新日期: 2023-09-27 18:27:08

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

例如,类型:汽车、公寓选择"汽车",将动态添加两个新的下拉列表"价格"&"模型"。选择"建筑",将动态添加两个新的下拉列表"区域"&"地板"

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

感谢

Posting Dynamic Forms in ASP.NET MVC 3

您可以使用FormCollection访问页面上的所有字段。但是,您将丢失自动模型绑定,并且必须在表单集合中进行迭代以找到以下值:

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

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

啊误会了。

如果你知道可以添加哪些Dropdown,我总是会对你的模型有一个价值。如果没有收到任何消息,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%安全的)。这也可能会带来一些安全问题,但在一些场景中,你可能会使用它,我假设你有其中一个。

如果不是这样的话,不要忘记,仅仅因为Model有一个属性,它根本不必被发布回来。

你可以做:

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

控制器会尽最大努力填充模型,但如果你不从表单中返回一些字段,它们将为null,操作仍然有效。

我还使用父模型的子对象实现了更复杂的场景,这些对象都可以为null。这需要对mock视图中对EditorTemplates的ajax调用进行一些奇特的处理,以确保前缀对MVC进行解析是正确的,但我在这里不做赘述。