从POST动作asp.net mvc获取数据

时间:2012-03-07 11:56:27

标签: asp.net-mvc

我发布了我的<input type="submit" value ="submit">数据,其格式如下(使用firebug检查)

Role1 true
Role1 false
Role1 true
Role1 false
Name1 "Name 1"
Name2 "Name2"

并在我的控制器中

[HttpPost]
public ActionResult GetPostData(ArrayList data)

问题是我应该在控制器中放置什么样的参数才能拥有某种数据结构,这些结构会被post发送的值填满?我不想使用FormCollection。我可以制作某种PostModel,但所有这些数据都是通过jquery动态生成的隐藏字段发送的,所以我无法想象如何将postmodel与字段绑定。

2 个答案:

答案 0 :(得分:4)

我想你的意思是(因为有四次角色1似乎有点奇怪):

Role1 true
Role1 false
Role2 true
Role2 false
Name1 "Name 1"
Name2 "Name2"

您可以使用视图模型:

public class MyViewModel
{
    public bool Role1 { get; set; }
    public bool Role2 { get; set; }
    public string Name1 { get; set; }
    public string Name2 { get; set; }
}

然后:

[HttpPost]
public ActionResult GetPostData(MyViewModel model)
{
    ...
}

因为我怀疑你正在做复选框的东西(由于每个角色的双布尔值,因为CheckBox帮助器生成一个隐藏的字段),这里是我建议你:

型号:

public class RoleViewModel
{
    public bool IsSelected { get; set; }
    public string Name { get; set; }
}

public class EditRolesViewModel
{
    public RoleViewModel[] Roles { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new EditRolesViewModel
        {
            Roles = new[]
            {
                new RoleViewModel { Name = "Role 1", IsSelected = true },
                new RoleViewModel { Name = "Role 2", IsSelected = false },
                new RoleViewModel { Name = "Role 3", IsSelected = true },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(EditRolesViewModel model)
    {
        return View(model);
    }
}

查看:

@model EditRolesViewModel

@using (Html.BeginForm())
{
    for (int i = 0; i < Model.Roles.Length; i++)
    {
        <div>
            @Html.HiddenFor(x => x.Roles[i].Name)
            @Html.LabelFor(x => x.Roles[i].IsSelected, Model.Roles[i].Name)
            @Html.CheckBoxFor(x => x.Roles[i].IsSelected)
        </div>
    }
    <button type="submit">OK</button>
}

甚至更好,使用将为每个角色呈现的编辑器模板:

@model EditRolesViewModel

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Roles)
    <button type="submit">OK</button>
}

和编辑器模板(~/Views/Shared/EditorTemplates/RoleViewModel.cshtml):

@model RoleViewModel

<div>
    @Html.HiddenFor(x => x.Name)
    @Html.LabelFor(x => x.IsSelected, Model.Name)
    @Html.CheckBoxFor(x => x.IsSelected)
</div>

答案 1 :(得分:0)

像Darin建议你应该使用视图模型。

这样您就可以将数据从Controller传递到View,反之亦然。当您验证视图模型,检测某种验证错误(例如值太低)然后将所有数据发送回视图时,这非常方便。

您可以找到关于“移动”的不同方法的良好说明。客户端和服务器端之间来回传输数据。

Use ViewData and Implement ViewModel Classes

Views and ViewModels

<强>更新

问题可能在于复选框的绑定,所以我添加的链接可能也是&#34;泛型&#34;。