3

@ Html.DropDownListを使用して、ビュー内に同じ値を持つ複数のドロップダウンボックスを表示するとします。ViewBagのようなものを返された各月にバインドすることなく、これらのドロップダウンボックスをすべてレンダリングできる簡単な方法はありますか?

例えば:

コントローラ

List<SelectListItem> items = new List<SelectListItem>();

var values = (from v in db.Values select v);

foreach (var value in values)
{
    items.Add(new SelectListItem { Text = value.Name, Value = value.Id });
}

ViewBag.Values = PopulateSelectList("Values");

意見

@Html.DropDownList("Values")

しかし、目標は次のようなものを持つことです

<div class="control-group">
    @Html.LabelFor(model => model.DesignStyle)
    <div class="controls">
        @Html.DropDownList("Values")    @Html.DropDownList("Values")
        @Html.DropDownList("Values")    @Html.DropDownList("Values")
        @Html.DropDownList("Values")    @Html.DropDownList("Values")
        @Html.DropDownList("Values")    @Html.DropDownList("Values")
        @Html.DropDownList("Values")    @Html.DropDownList("Values")
    </div>
</div>

@foreach (item in Model)私の推測では、ビューの各ドロップダウンにデータを入力するには、なんらかの種類が必要になると思います

これは、何かを実現する方法についての私の最初の考えのサンプルです。

List<SelectListItem> results = new List<SelectListItem>();
SelectListItem item = null;

var values = (from v in db.Values select v);

for (int i = 0; i <= 15; i++)
{
     item = new SelectListItem();

     item.Text = "Select a value";
     item.Value = "1";

     results.Add(item);

     foreach (var thread in threads)
     {
         item.Text = thread.Name;
         item.Value = thread.Id;

         results.Add(item);
     }
 }

私がしたくないのは、SelectListItemに複数回データを入力し、それぞれを個別のViewBagアイテムに配置するロジックを複製することです。

4

2 に答える 2

4

選択リストを再利用できます。DropDownListまたはの適切なオーバーレイを使用するだけDropDownListForです。(通常)行うべきことは、ドロップダウンに異なる名前を付けることです。例えば:

 @Html.DropDownListFor( m => m.PickedValue1, ViewBag.Values)
 @Html.DropDownListFor( m => m.PickedValue2, ViewBag.Values)

または、強く型付けされていないものを好む場合DropDownList

 @Html.DropDownList( "PickedValue1", ViewBag.Values)
 @Html.DropDownList( "PickedValue2", ViewBag.Values)
于 2012-11-06T17:43:00.277 に答える
0

これを解決/レンダリングするために、EditorTemplate機能を使用することになりました。

モデルはこれから変更されました:

public class ValueModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

これに:

public class ValueModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    public List<ValueDropDownModel> DropDown { get; set; }
}

public class ValueDropDownModel
{
    [Range(0, 15)]
    public int DropDown { get; set; }

    public int Id { get; set; }
    public string Name { get; set; }

    public List<SelectListItem> AvailableDropDown { get; set; }
}

のフォルダのViews下に、というサブフォルダValueがありますEditorTemplates。これには2つのビューが含まれます。AValueModel.cshtmlValueDropDownModel.cshtml

ValueModel.cshtml含まれています:

@model SomeSolution.Web.Models.ValueModel

<div class="row-fluid">

    <div class="span6">
        <div class="control-group">
            @Html.LabelFor(m => m.Name)
            <div class="controls">
                @Html.EditorFor(m => m.Name)
                @Html.ValidationMessageFor(m => m.Name)
            </div>
        </div>

    </div>
</div>

<div class="row-fluid">
    <div class="span4">
        @for (int i = 0; i < 5; ++i)
        {
            @Html.EditorFor(m => m.DropDown[i])
        }
    </div>

    <div class="span4">
        @for (int i = 5; i < 10; ++i)
        {
            @Html.EditorFor(m => m.DropDown[i])
        }
    </div>

    <div class="span4">
        @for (int i = 10; i < 15; ++i)
        {
            @Html.EditorFor(m => m.DropDown[i])
        }
    </div>
</div>

ValueDropDownModel.cshtml含まれています:

@model SomeSolution.Web.Models.ValueDropDownModel

<div class="control-group">
    @Html.HiddenFor(m => m.DropDown)
    @String.Format("DropDown {0}", Model.DropDown)
    <div class="controls">
        @Html.DropDownListFor(m => m.Id, Model.AvailableDropDown)
        @Html.ValidationMessageFor(m => m.Id)
    </div>
</div>

ValueControllerドロップダウンにデータを入力するためのいくつかのヘルパーメソッドが含まれるようになりました

    private void FillAvailableValues(ValueModel modelValue, Entities db)
    {
        var values = (from v in db.Values
                       orderby v.Name
                       select v);

        foreach (var model in modelValue.Values)
        {
            model.AvailableDropDown = new List<SelectListItem>();
            model.AvailableDropDown.Add(new SelectListItem()
            {
                Text = "Unassigned",
                Value = "0",
                Selected = (model.Id == 0)
            });

            foreach (var value in values)
            {
                model.AvailableDropDown.Add(new SelectListItem()
                {
                    Text = value.Name,
                    Value = value.Id,
                    Selected = (model.Id.ToString() == colour.Id)
                });
            }
        }
    }

    private void InitDefaultDropDown(ValueModel model)
    {
        model.DropDown = new List<ValueDropDownModel>();
        for (int i = 0; i < 15; i++)
        {
            model.DropDown.Add(new ValueDropDownModel()
            {
                DropDown = i + 1,
                Id = 0
            });
        }
    }

このFillAvailableValuesメソッドは、およびで呼び出されCreate ActionResultEdit ActionResultドロップダウンを初期化します。このInitDefaultDropDownメソッドはCreate ActionResult、ページでドロップダウンを設定するために呼び出されます。

于 2012-11-06T20:13:22.023 に答える