我如何创建/使用表单和模型绑定器从View =>控制器
本文关键字:绑定 模型 View 控制器 表单 何创建 创建 | 更新日期: 2023-09-27 18:10:56
我有一个MVC 4 Razor视图,我传递了一个具有User
集合和Entities
集合的视图模型。
为了这个问题的目的,假设我正试图向每个Entities
添加一个新的User
。我有一个文本表单字段,你在其中输入用户名然后那个用户名和实体被发送到控制器方法AddUser(User user, IEnumerable<Entity> ents)
这个方法也可以是AddUser(long UserId, IEnumerable<TPkey> keys)
。AddUser
获得User
和Entity
s,并负责将User
添加到每个Entity
s
那么,我应该如何将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" />
}
}
明白了吗?我更喜欢使用更强类型的方法将键传递给控制器,因为现在我必须对键字符串进行一些粗略的解析,并且我更喜欢能够传递强/泛型对象。
要列出一个模型属性,该属性是另一个类的对象集合,请尝试:
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;}
}
视图中,必须列出person对象中的car对象作为输入,以属性名和索引
命名 @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" />
}
使用此方法,您的模型将自动使用表单
请尝试以下代码。要使用更强类型的方法,您应该使用带有实体模型列表的User模型。
模型:
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)
}
}