9

ASP.NETMVCのドロップダウンリストは私を混乱させます。モデルクラスがあります。モデルクラスには、SelectedValueという文字列があります。この文字列は、以前に選択された値を表します。データベースから取得したアイテムのコレクションがあります。コレクションの各アイテムには、IDと名前の値があります。私の問題は、この情報をUIに取り込むための推奨される方法がわからないことです。

ViewBagとModelのどちらを使用すべきかわかりません。ただし、値がそこにあると、UIにデータを入力するための最良の方法が何であるかさえわかりません。HTMLヘルパーやRAZOR構文を使用している人々を見てきました。私はとても混乱しています。人々は何をお勧めしますか?

ありがとうございました

4

4 に答える 4

10

これは私がそれを行う方法です、あなたが2つのモデルを持っているとしましょうTeam and Player

Player.cs

public class Player
{
    [HiddenInput(DisplayValue = false)]
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }        

    [Required]
    [ForeignKey("Team")]
    [Display(Name = "Team")]
    public int TeamId { get; set; }        

    [Display(Name = "First name")]
    public string FirstName { get; set; }

    [Display(Name = "Last name")]
    public string LastName { get; set; }

    public virtual Team Team { get; set; }        
}

Team.cs

 public class Team
{
    [Key]
    [HiddenInput(DisplayValue = false)]
    public int TeamId { get; set; }

    [Display(Name = "Full Name:")]
    public string Name { get; set; }        

    public virtual ICollection<Player> Players { get; set; }
}

次に、PlayerControllerで: 注:プレーヤーを作成するには、チームが存在する必要があります

    private void PopulateTeamsDropDownList(object selectedTeams = null)
    {
        var teamsQuery = from d in _dataSource.Teams
                         orderby d.Name
                         select d;
        ViewBag.TeamID = new SelectList(teamsQuery, "TeamId", "Name", selectedTeams);
    }

    [HttpGet]
    public ActionResult Create()
    {
        PopulateTeamsDropDownList();
        return View();
    }

    [HttpPost]
    public ActionResult Create(Player model)
    {
        if (ModelState.IsValid)
        {
            using (EFootballDb db = new EFootballDb())
            {
                try
                {
                    var player = new Player
                                     {
                                         FirstName = model.FirstName,
                                         LastName = model.LastName
                                     };
                    db.Players.Add(player);
                    db.SaveChanges();
                    return RedirectToAction("About", "Home");
                }
                catch (Exception)
                {
                    ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
                }
            }
        }
        PopulateTeamsDropDownList(model.TeamId);
        return View(model);
    }

そして最後に、Playerのビューの作成は次のようになります。

@{
ViewBag.Title = "Create";
 }

<h2>Create</h2>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Player</legend>

    <div class="editor-label">
            @Html.LabelFor(model => model.TeamId, "Pick Your Team")
    </div>
    <div class="editor-field">
        @Html.DropDownList("TeamId", String.Empty)
        @Html.ValidationMessageFor(model => model.TeamId)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.FirstName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FirstName)
        @Html.ValidationMessageFor(model => model.FirstName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.LastName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.LastName)
        @Html.ValidationMessageFor(model => model.LastName)
    </div>        

    <p>
        <input type="submit" value="Create" />
    </p>
  </fieldset>
 }

 <div>
     @Html.ActionLink("Back to List", "Index")
 </div>

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
于 2013-03-16T04:06:24.213 に答える
8

私のやり方は、ドロップダウンをViewModelの一部にすることです....それはProductsであると言います....私のViewModelには

public SelectList Products { get; set;}
public int ProductId { get; set; }  // For the the selected Product

したがって、ビューが読み込まれ、コントローラーのビューに戻るようにモデルにデータを入力しているときは、次のようにします。

model.Products = new SelectList(MyEnumerableofProducts, "ValueField", "TextField", {value of the selected item in the dropdown, as a string)

私の見解では、私は次のようになります。

@Html.DropDownListFor(model => model.ProductId, Model.Products, "Please Select")



return View(model)
于 2013-03-16T01:43:07.450 に答える
0

VB.Netを使用している場合-MVC4-Razorこの回答はFrigikとほぼ同じです(Thanks Frigik)

モデルで2つのフィールドを作成します。1つはSelectedItem(ここでは文字列のTagType)を保持するフィールドで、もう1つはドロップダウン値(TagTypeList)です。

モデルクラス-Tag.vb

Imports System.Web.Mvc

Private _tagType As String
Private _tagTypeList As List(Of SelectListItem)

Public Property TagType() As String
        Get
            Return _tagType
        End Get
        Set(ByVal value As String)
            _tagType = value
        End Set
End Property

Public Property TagTypeList() As List(Of SelectListItem)
        Get
            Return _tagTypeList
        End Get
        Set(value As List(Of SelectListItem))
            _tagTypeList = value
        End Set
    End Property

'In the constructor

Sub New()
        TagTypeList = CommonUtility.LoadDropDownByName("TAGTYPE")
End Sub

CommonUtilityクラス内-CommonUtility.vb

Imports System.Web.Mvc
Imports System.Collections.Generic


Public Shared Function LoadDropDownByName(ByVal DropDownName As String) As List(Of SelectListItem)
        Dim dt As DataTable
        Dim ds As DataSet
        Dim results As List(Of SelectListItem) = Nothing
        Try
            ds = objSignOn.LoadDropDown(DropDownName)   'Pass the dropdown name here and get the values from DB table which is - select ddlId, ddlDesc from <table name>
            If Not ds Is Nothing Then
                dt = ds.Tables(0)
                If (dt.Rows.Count > 0) Then
                    results = (From p In dt Select New SelectListItem With {.Text = p.Item("ddlDesc").ToString(), .Value = p.Item("ddlId").ToString()}).ToList()
                End If
            End If
        Catch ex As Exception
        End Try
        Return results
    End Function

ビューで

@Html.DropDownListFor(Function(x) x.TagType, Model.TagTypeList, "", New With {.id = "ddlTagType",.class = "dropDown", .style = "width: 140px"})

ここでは、3番目のパラメーター(オプション)を空として、1番目の項目を空としてドロップダウンに挿入します。最初のパラメーターはselectedItemであり、値がDBテーブルに既に存在する場合にデータを入力するのに役立ちます。

これがVB.Netを使用している人に役立つことを願っています

于 2013-06-12T13:09:59.813 に答える
0

上記の方法に加えて、ルックアップテーブルで複数の外部キーを使用するためにこのアプローチを使用することもできます。私が見た限りでは、それは非常に明確で効果的です。

于 2013-10-20T20:25:07.523 に答える