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

6
在我正在处理的一个表单中,如果用户选择了下拉列表“类型”,根据所选值,我会动态显示一组其他下拉列表。
例如,类型:汽车、公寓。选择“汽车”,将动态添加两个新的下拉列表“价格”和“型号”。选择“公寓”,将动态添加两个新的下拉列表“区域”和“楼层”。
我的问题是如何处理发送到服务器的数据?通常情况下,我会接收表单字段并自动进行“模型绑定”。但是那些基于用户选择在页面上添加的动态字段怎么办?我该如何在操作中检索它们?
谢谢

@COLDTOLD 这是一个服务器端的问题,ajax 不是一个会产生任何影响的解决方案。 - Marek Karbarz
@Marek Karbarz 你可以通过使用ajax添加新项来刷新页面的部分内容。 - COLD TOLD
2个回答

8
您可以使用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; }
}

控制器会尽力填充模型,但如果您没有从表单中传回某些字段,则它们将为空,并且操作仍将正常工作。

我还使用了更复杂的方案,例如使用父模型的子对象以及所有可为空的对象。这需要一些花哨的工作来绕过 AJAX 调用到编辑器模板中的模拟视图,以确保 MVC 解析的前缀是正确的,但我不会在这里详细介绍。


问题是,DropDowns是动态的,事先不知道会出现哪些DropDowns!不过有一个问题,如果我将没有DropDowns的ViewModel设置为Action的输入,是否有办法在Action方法的主体内访问FormsCollection? - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接