2016-07-25 84 views
0

这给我很难实现。我已经生成了一个控制器和视图来处理更新模型。将下拉列表添加到mvc页面

但是在Create.cshtml中,我需要向数据库用户添加一个下拉列表(使用db.Users.Tolist())来填充下拉列表。

<div class="form-group"> 
    @Html.LabelFor(model => model.UserId, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     // @Html.EditorFor(model => model.UserId, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.DropDownListFor(model => model.UserId, ViewData["u"] as IEnumerable<SelectListItem>) 
    </div> 
</div> 

所以我已经采取@Html.EditorFor()和替换它与@Html.DropDownListFor()以显示下拉列表。这确实有用,但是当我点击提交时我收到一个错误。

具有键'UserId'的ViewData项目类型为'System.String',但必须是'IEnumerable'类型。

这里是模型。

public class pdf 
{ 
    [Key] 
    public int ID { get; set; } 
    public string UserId { get; set; } 
    public Guid FileGuid { get; set; } 
    public string FileName { get; set; } 
    public string FileLocation { get; set; } 
} 

并创建控制器。

public ActionResult Create() 
{ 
    if (ModelState.IsValid) 
    { 
     var u = db.Users.Select(x => new { UserId = x.Id, UserName = x.UserName }).ToList(); 
     //u[0].UserName 
     ViewBag.userinfo = new System.Web.Mvc.MultiSelectList(u, "UserId", "UserName"); 
     IEnumerable<SelectListItem> u1 = new SelectList(db.Users.ToList(), "Id", "UserName"); 
     ViewData["u"] = u1; 
    } 
    return View(); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "ID,UserId,FileGuid,FileName,FileLocation")] pdf pdf) 
{ 
    if (ModelState.IsValid) 
    { 
     db.tblPDF.Add(pdf); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(pdf); 
} 

我觉得我快到了。但只需要朝正确的方向推动这项工作。

+0

请注意,模型 - 视图 - 控制器标签是关于模式的问题。 ASP.NET-MVC实现有一个特定的标签。 –

+0

副本很好地解释了它:在您的HttpPost操作方法中,如果要再次呈现视图,则必须再次初始化SelectList。第二段的最后一行:_“如果您返回视图,则必须先重新分配CategoryList的值,就像您在GET方法中所做的那样”_“。另外,不要在你的问题中加入关于密切原因的评论,添加评论和@ @通知最近的选民。 – CodeCaster

回答

1

这是你如何让你的SelectListItems

ViewData["items"] = db.UserProfiles 
    .Select(x => new SelectListItem() { Text = x.UserName, Value = x.UserId.ToString() }); 

这是你将如何使用它

@Html.DropDownListFor(model => model.UserId, ViewData["items"] as IEnumerable<SelectListItem>) 
+0

这当然完美地填充列表。然而,当点击提交我仍然得到。 {“具有'UserId'键的ViewData项的类型是'System.String',但是必须是'IEnumerable '的类型。”}是否需要改变控制器文章中的内容? – Prescient

+0

@Prescient 您可能需要创建一个新模型,仅用于显示将UserId作为字符串(视图模型,如果您愿意)的视图。然后,您必须更改Create方法以将db模型转换为视图模型,然后更改您的CreatePost方法以将其转换回您的db模型。也可能有另一种更简单的方法。我不会使用剃刀。 –

0

我从来没有尝试直接传递selectlistitem收集到的页面。我通常会将该列表添加到模型中,然后使用剃须刀创建一个新的selectlistitem集合。

您是否有选择修改模型?

@Html.DropDownListFor(model => model.UserId, Model.availableUsers.Select(user => new SelectListItem() { Text = user.displayVariable, Value = user.userId, Selected = user.userId == model.UserId }).ToArray())