2016-07-25 13 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

model-view-controllerタグはパターンについての質問です。 ASP.NET-MVCの実装には特定のタグがあります。 –

+0

重複は非常にうまく説明します。HttpPostアクションメソッドでは、ビューを再度レンダリングする場合は、SelectListを再度初期化する必要があります。 2番目の段落の最後の行:_ "ビューを返す場合は、GETメソッド" _ "で行ったのと同じように、まずCategoryListの値を再割り当てする必要があります。また、あなたの質問の中の終わりの理由についてのコメントを追加したり、コメントを追加したり、close-voterに '@ notify'したりしないでください。 – CodeCaster

答えて

1

これはこれは私がページに直接selectlistitemコレクションを渡して試したことがありませんあなたは

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

これは確かにリストを完全に埋め込みます。しかし、私はまだ取得をクリックして送信をクリックします。 {"キー 'UserId'を持つViewDataアイテムは 'System.String'タイプですが、 'IEnumerable 'タイプでなければなりません。"}コントローラーのポストで何かを変更する必要がありますか? – Prescient

+0

@Precient UserIdを文字列として持つビューを表示するためだけに新しいモデルを作成しなければならない場合があります(ビューモデル)。 dbモデルをビューモデルに変換するCreateメソッドを変更し、CreatePostメソッドを変更してdbモデルに変換し直す必要があります。あまりに簡単な別の方法もあるかもしれません。私はそれほど剃刀を使わない。 –

0

それを使用する方法であるあなたがSelectListItemsを作ることができる方法

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

です。私は通常、モデルにリストを追加し、次に、剃刀で新しいselectlistitemコレクションを作成します。

モデルを変更する選択肢はありますか?

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