繁体   English   中英

MVC SelectList将随机值设置为“选定”

[英]MVC SelectList setting random value as 'selected'

我有一个硬编码的选择列表,从db中提取Value和Text。
我有一个要设置为“默认”的特定项目,因此我命令列表专门将其放在第一行(“ Wip”)。 但是,当列表以HTML呈现时,列表的顺序是正确的,但是选定的值是具有最小值的项目,即使由于顺序降序它位于列表的底部。

型号

    public IEnumerable<SelectListItem> BinOptionsList { get; set; }

资料存取

    public IEnumerable<SelectListItem> PopulateBinList()
    {
        using (var db = new InventoryContext())
        {
            var data = db.StorageBin.OrderByDescending(s => s.BinCode == "Wip").ThenBy(s => s.BinCode).Select(s => new SelectListItem()
            {
                Text = s.BinCode,
                Value = s.BinId.ToString()
            }).ToList();

            return data;
        }
    }

控制器

    model.BinOptionsList = dal.PopulateBinList()

查看

 @Html.DropDownListFor(model => model.BinId, Model.BinOptionsList, new { @class = "form-control" })

该列表以“ Wip”作为第一个选择在视图中呈现,但是呈现的“ selected = selected”选项是id = 0的项。

我知道我可以在“数据访问”方法中设置“选定”值,但是我不能在已经具有选定值的编辑表单中使用它。

更新- 呈现的HTML

<select class="form-control" data-val="true" data-val-number="The field Bin Code must be a number." data-val-required="The Bin Code field is required." id="BinId" name="BinId">
    <option value="582">WIP</option>
    <option value="595">0888</option>
    <option selected="selected" value="0">0919</option>
    <option value="1">1</option>
    <option value="2">1A1</option>
    <option value="3">1A10</option>
    <option value="4">1A11</option>
</select>

我很确定BindId等于0。如果BindId是简单的Integer,则默认情况下它将始终等于0。 您需要自己将其设置为582还是将其设置为Integer? 它将默认设置为null。

因此,您可能不喜欢此答案,但让我概述一下。 您的选择列表不应属于您的模型。 从您选择的值中选择的值应该是模型的一部分。 您在模型中增加了太多开销,并且对您的视图产生了影响。 重构它。 将您的选择列表放在ViewBag中供您在视图中使用,不要再来回传递它。 这将使模型紧凑,并允许您正确设置选项。

这是一个简单的例子。

什么是您的数据访问权限(仅出于示例目的将其存根,为简单起见将其设置为静态):

    public static IEnumerable<SelectListItem> PopulateBinList()
    {

        return new List<SelectListItem>{ new SelectListItem {
            Text = "WIP", Value = "582"
        }, new SelectListItem {
            Text = "0888", Value = "595"
        } , new SelectListItem {
            Text = "0", Value = "0919"
        }, new SelectListItem {
            Text = "1", Value = "1"
        }};

    }

然后是您的模型(例如,仅添加一个属性)

public class BinModel
{
    public string BinId { get; set; }
}

在您的控制器中

    public ActionResult Index()
    {
        //load up your select list into the view bag
        ViewBag.BinOptions = ViewHelper.PopulateBinList();
        //preset the value of your desired object
        var bm = new BinModel { BinId = "582" };
        return View(bm);

    }

在您的视图中,您将绑定到模型属性,但是使用在视图包中定义的临时列表来填充选项。 预设模型的属性将自动选择选择列表中的默认值:

@Html.DropDownListFor(x => x.BinId, (IEnumerable<SelectListItem>)ViewBag.BinOptions, null, new { @class ="form-control" })

如果这没有意义或需要扩展,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM