0

我的 Razor 视图中有一些 HTML,基本上是 3 行的一对 Select 和 Input 元素:( 可能超过 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; }
}

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

4

1 回答 1

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)

然后在您的主视图中,您使用 MyModel 列表作为视图的模型,并使用 for 循环来呈现您的编辑器模板。

@model List<MyModel>

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

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

于 2013-03-08T01:58:51.070 回答