使用Razor / form post映射字符串键值对的列表

时间:2013-03-08 00:00:29

标签: asp.net-mvc asp.net-mvc-3 razor

我的Razor视图中有一些HTML,基本上是一对Select和Input元素的3行: (可能超过3个)

<select name="SocialNetwork[1]">
    <option>Skype</option>
    <option>Twitter</option>
    <option>Facebook</option>
</select>

<input name="SocialNetworkUsername[1]" type="text" />

<select name="SocialNetwork[2]">
    <option>Skype</option>
    <option>Twitter</option>
    <option>Facebook</option>
</select>

<input name="SocialNetworkUsername[2]" type="text" />

<select name="SocialNetwork[3]">
    <option>Skype</option>
    <option>Twitter</option>
    <option>Facebook</option>
</select>

<input name="SocialNetworkUsername[3]" type="text" />

当表单发布到我的控制器方法时:

public ActionResult SaveDetails(MyModel model)
{
}

如何'映射'SocialNetwork的值? SocialNetworkUsername到模型? 类似的东西:

public class MyModel
{
    public string SomeProperty { get; set; }
    public string SomeOtherProperty { get; set; }

    public Dictionary<string,string> SocialNetworks { get; set; }
}

如果有更合适的东西,我不会'卡住'使用字典

1 个答案:

答案 0 :(得分:0)

您可以使用编辑器模板来实现此目的。

编辑器模板将允许您在主视图中循环浏览社交网络列表,并使用@ Html.EditorFor帮助程序渲染下拉列表并轻松进行模型绑定。

首先,您的模型应该代表一个社交网络

在模型中,您需要包含下拉列表值的属性以及所选值的属性。您还需要一个属性来包含SocialNetworkUsername

public IEnumerable<SelectListItem> SocialNetworks { get; set; }
public string SelectedSocialNetwork { get; set; }

public string SocialNetworkUserName { get; set; }

使编辑器模板添加新文件夹/ Views / Shared / EditorTemplates

在EditorTemplates文件夹中,使用名称MyClass(或您的模型类名称)创建一个新视图

您需要遵循这些命名约定,因为编辑器模板无需其他配置。

在MyClass.cshtml中,您需要允许编辑单个社交网络

@model MyModel

@Html.DropDownListFor(m => m.SelectedSocialNetwork, Model.SocialNetworks)

@Html.TextBoxFor(m => m.SocialNetworkUserName)

然后在主视图中使用List of MyModel作为视图的模型,并使用for循环来渲染编辑器模板。

@model List<MyModel>

@using(Html.BeginForm())
{
    for (var i = 0; i < Model.Count; i++)
    {
        Html.EditorFor(Model[i])
    }
}

在您的控制器中,只需更改您的操作方法参数以接受MyClass列表,模型绑定应该只是神奇地工作;)