无法在编辑页面上为下拉列表设置现有值

时间:2017-03-10 09:54:32

标签: c# .net asp.net-mvc

首先,我有来自现有数据库的预定义模型。 我只想在MVC 5的编辑页面上显示现有值。

这就是我所做的:

控制器

public async Task<ActionResult> Edit(Guid? id)
{
     if (id == null)
     {
         return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
     }
     slik_data_a01 slik_data_a01 = await db.slik_data_a01.FindAsync(id);
     if (slik_data_a01 == null)
     {
         return HttpNotFound();
     }
     //init DD

     var selectedjs = (from x in db.master_segmenfasilitas
                       where x.sandi == slik_data_a01.kode_jenis_segmen
                       select new { x.fasilitas, x.sandi }).FirstOrDefault();
     var jenissegmen = new SelectList((from x in db.master_segmenfasilitas
                                       select new { x.fasilitas, x.sandi }).ToList(), "sandi", "fasilitas", selectedjs);


     ViewBag.jenissegmen = jenissegmen;
     return View(slik_data_a01);
}

我的观点是这样的:

<div class="form-group">
    @Html.LabelFor(model => model.kode_jenis_segmen, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
    @Html.DropDownListFor(model => model.kode_jenis_segmen, ViewBag.jenissegmen as SelectList, new{ @class = "form-control input-sm" })
    @Html.ValidationMessageFor(model => model.kode_jenis_segmen, "", new { @class = "text-danger" })
    </div>
</div>

但默认值始终显示SelectList的第一个数据, 虽然我在控制器上定义了选定的值,但不是现有的。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:1)

在将对象传递给最后一行的View方法之前,您需要在与DropDownListFor帮助器绑定的model属性中设置所选值,而不需要在SelectList构造函数中设置所选值,因此将SelectList创建代码更改为:

var jenissegmen = new SelectList((from x in db.master_segmenfasilitas
                                  select new { x.fasilitas, x.sandi }).ToList(), 
                                  "sandi", 
                                  "fasilitas");

并且在模型属性中传递模型集选择值之前,帮助器将自行选择值:

slik_data_a01.kode_jenis_segmen = selectedjs;
ViewBag.jenissegmen = jenissegmen;
return View(slik_data_a01);

现在,控件将根据与其绑定的属性中的值设置所选值。

希望它有所帮助!

答案 1 :(得分:0)

我一直在努力解决这个问题,简单的答案是我无法在模型中没有关系的模型上分配选定的值。

唯一的方法是我需要更新我的模型,或创建另一个表示我的数据的模型(CMIIW)。

但是我发现了一个简单的黑客,它不需要改变模型,仍然不完美,但它对我来说很好。

这是我更新的控制器:

public async Task<ActionResult> Edit(Guid? id)
{
     if (id == null)
     {
         return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
     }
     var slik_data_a01 = await db.slik_data_a01.FindAsync(id);
     if (slik_data_a01 == null)
     {
         return HttpNotFound();
     }
     //init Dropdown Data    
    ViewBag.jenissegmen = new SelectList((from x in db.master_segmenfasilitas
                                       select new { x.fasilitas, x.sandi }).ToList()
    /*OrderByDescending to put the selected value on first row*/
    .OrderByDescending(o => o.sandi == slik_data_a01.kode_jenis_segmen)
    , "sandi", "fasilitas");


    //then return to the view.
     return View(slik_data_a01);
}

并且视图仍在使用Html.DropDownListFor