我正在开发一个mvc .net web应用程序,我正在使用Entity Framework。在我的模型中,我有一个名为“utisateur”(用户)的实体,每个用户都有一个或多个监督他的用户。我想要做的是生成一个多选列表框,其中包含所有用户的列表,以便选择新用户的主管。
我尝试过这个但是在填写表单以创建新用户并提交之后我收到了这个错误:对象引用未设置为对象的实例,但是我得到了选择列表并且我从中选择了项目。 (空对象是“model.selectedusers”,但我不知道为什么它是空的!)
这是我的模特课:
public class util
{
public util()
{
user = new utilisateur();
listesups = Getutilisateurs(null);
}
public utilisateur user { get; set; }
public int[] selectedusers;
public string nom_role { get; set; }
public MultiSelectList listesups { get; set; }
public MultiSelectList Getutilisateurs(int[] selectedValues)
{
var db = new BDGestionEntities();
List<utilisateur> utilisateurs = db.utilisateurs.ToList();
return new MultiSelectList(utilisateurs, "id", "login", selectedValues);
}
}
这是我的控制器:
public ActionResult Create2()
{
util u = new util();
u.listesups = new MultiSelectList (db.utilisateurs, "id", "login");
return View(u);
}
[HttpPost]
public ActionResult Create2(util model)
{
utilisateur u = new utilisateur();
try
{
foreach (var selecteduse in model.selectedusers)
{
utilisateur utilisateur = db.utilisateurs.Where(c => c.id == selecteduse).FirstOrDefault();
u.superieur.Add(utilisateur);
}
}
catch(Exception ex)
{
Logger.Error(ex.Message, "Erreur ajout supérieurs");
}
u.nom = model.user.nom;
u.prenom = model.user.prenom;
u.solde_conge = model.user.solde_conge;
u.email = model.user.email;
u.login = model.user.login;
u.pwd = model.user.pwd;
role role = new role();
role = db.roles.Where(c => c.nom_role == model.nom_role).FirstOrDefault();
u.role = role;
db.utilisateurs.AddObject(u);
db.SaveChanges();
ViewBag.id_role = new SelectList(db.roles, "id", "nom_role", model.user.id_role);
return RedirectToAction("index");
}
以下是包含选择列表
的视图部分@Html.ListBoxFor(model => model.selectedusers, Model.listesups)
这就是我在提交表单之前所获得的内容,正如您在此处所看到的,该视图包含选择列表但未保存所选项目
答案 0 :(得分:1)
默认情况下,MVC 3中没有内置支持将多个项目(或arry或items)包含在ViewModel中。这就是您丢失所选值的原因。
有很多方法可以实现,但更简单的方法是修改方法的签名以包含表单集合并查询列表框的值。
您的Create2
方法应如下所示:
[HttpPost]
public ActionResult Create2(FormCollection collection,util model)
{
//load selected users into a variable
var selUsers= collection["selectedusers"];
//do whatever you want to do with the selected users.