如何创建/使用表单和模型绑定器从View =>传递集合?调节器

时间:2014-07-01 16:29:25

标签: c# asp.net asp.net-mvc entity-framework

我有一个MVC 4 Razor视图,我传递了一个视图模型,其中包含UserEntities的集合。

就本问题而言,假设我正在尝试向User中的每一个添加新的Entities。所以我有一个文本表单字段,您可以在其中输入用户名,然后将该用户名和实体发送到控制器方法AddUser(User user, IEnumerable<Entity> ents) 此方法也可以是AddUser(long UserId, IEnumerable<TPkey> keys)AddUser获取UserEntity,并负责将User添加到每个Entity

那么,我应该如何将IEnumerable<TPkey>传递给控制器​​方法?

由于控制器需要处理不同类型的主键,这也有些复杂。

现在我正在这样做:

    @using (Html.BeginForm("AddUser", ViewContext.RouteData.Values["Controller"].ToString()))
    {

        <label for="user"> Username (or Email) to grant access:</label>
        <input type="text" name="user" />
        <input type="submit" value="Grant Access" />

        foreach (var item in Model.Entities)
        {
            <input type="hidden" name="keys" value="@item.PKey" />
        }
    }

这有意义吗?我更喜欢使用更强类型的方法将键传递给控制器​​,因为现在我不得不对键串做一些粗略的解析,我宁愿能够强调/强调/通用类型对象。

2 个答案:

答案 0 :(得分:2)

要列出作为另一个类的对象集合的模型属性,请尝试以下方法:

Class Person {
   public int id {get; set;}
   public string name {get; set;}
   public List<Car> Cars {get; set;}
}

Class Car {
   public int id {get; set; }
   public string name {get; set;}
}

在视图中,您必须将人物对象中的汽车对象列为使用属性名称和索引

命名的输入
 @using (Html.BeginForm("AddUser", ViewContext.RouteData.Values["Controller"].ToString()))
    {

        <label for="name"> </label>
        <input type="text" name="name" />



int counter = 0;

foreach (var item in Model.Entities)
    {
        <input type="hidden" name="Cars[@counter.ToString()].id" value="@item.PKey" />
        <input type="hidden" name="Cars[@counter.ToString()].name" value="@item.name" />

        counter++;
    }

        <input type="submit" value="Grant Access" />
    }

使用此功能,您的模型会自动使用表单

发送的输入填充属性Cars

答案 1 :(得分:1)

请尝试以下代码。 要使用更强类型的方法,您应该使用具有实体模型列表的用户模型。

型号:

public class User
{
    public string UserName { get; set; }
    public List<Entity> Entities { get; set; }
}

public class Entity {
    public string PKey { get; set; }
}

控制器

public ActionResult Index()
{
    User u = new User();
    u.Entities = new List<Entity>();
    u.Entities.Add(new Entity { PKey = "A" });
    u.Entities.Add(new Entity { PKey = "B" });
    u.Entities.Add(new Entity { PKey = "C" });
    return View(u);
}

public ActionResult AddUser(User user) {
    // Add save logic here
    return View(u);
}

查看:

@model MVCSandbox.Models.User

@using (Html.BeginForm("AddUser", "User")) 
{ 

    <label for="user"> Username (or Email) to grant access:</label>
    @Html.TextBoxFor(u=>u.UserName)
    <input type="submit" value="Grant Access" />
    // The index is used to allow model binding the list of Entities
    for (int i = 0; i < Model.Entities.Count; i++) 
    { 
        @Html.TextBoxFor(m=>Model.Entities[i].PKey)
    }
}