2012-03-09 68 views
7

在我正在处理的其中一个表单上,如果用户根据所选值选择DropDownList“Type”,我将动态显示一组其他DropDownLists。在ASP.NET MVC中发布动态表单

例如,类型:汽车,公寓 选择“汽车”,将动态地添加两个新的DropDownLists“价格”&“模型”。 选择“建筑”,会动态添加两个新的DropDownLists“区域”&“楼层”

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

谢谢

+0

你试过用ajax – 2012-03-09 00:41:09

+0

@COLDTOLD这是一个服务器端的问题,Ajax是不是会造成任何影响 – 2012-03-09 00:54:44

+0

@Marek Karbarz您可以通过使用Ajax – 2012-03-09 05:37:30

回答

2

啊误会了这个。

如果您知道可能会添加下拉菜单,我会始终只对您的模型有一个值。如果没有收到任何内容,MVC会将它们设置为默认值。

编辑:您仍然可以从withing控制器使用

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; } 
} 

控制器将做到最好来填充模型,但如果你没有通过某些字段从形式回来了,他们只是为空,行动仍然会工作。

我也使用父模型的子对象并且所有可为空来实现更复杂的场景。这需要在mock Views中对EditorTemplates的ajax调用进行一些奇特的工作,以确保MVC解析前缀是正确的,但我不会在这里进行讨论。

+0

添加新项目的问题是刷新页面的局部部分的解决方案,DropDowns是动态的,无法知道DropDowns会显示什么! 虽然有一个问题,如果我设置为Action的输入没有DropDown的ViewModel,有没有一种方法可以访问Action方法体内的FormsCollection? – Bill 2012-03-09 06:17:37

8

您可以使用FormCollection访问页面上的所有字段。但是你会失去自动模式结合,将有通过表单收集来遍历找到你的值如下:

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

当然,你也可以只包括在模型中的动态下拉菜单。