设置已由数据库信息填充的下拉列表的默认值。 MVC 4

时间:2016-01-18 13:02:43

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

您好,我有一个程序从数据库表中读取以填充下拉列表。

类型表:

id     type
1      Day
2      Month
3      Year

型号:

[Display(Name = "Type: "),
Required(ErrorMessage = "Required")]
public int type { get; set; }

控制器:

    public void loadDropDown()
    {
         reviewlogsEntities db = new reviewlogsEntities();
         IEnumerable<SelectListItem> type = db.types.Select(m => new SelectListItem
         {
            Value = SqlFunctions.StringConvert((double)m.id),               
            Text = m.type1
         });

         ViewBag.type = type;
     }

        [HttpGet]
        public ActionResult AddLogReview()
        {
            if (Request.IsAuthenticated)
            {
                loadDropDown();        
                return View();
            }                             
            else
            {
                return RedirectToAction("index", "home");
            }
        }

        [HttpPost]
        public ActionResult AddLogReview(AddLogModel LogSubmission)
        {
            loadDropDown();

             if (ModelState.IsValid)
             {
                 //Send Data to database
                 return View();
             }
             else
             {
                 //If not authenticated then display an error message
                 ModelState.AddModelError("", "Submission erorr");       
             }
              return View();
        }

查看:

@using (Html.BeginForm())
{
    @Html.LabelFor(model => model.type)
    @Html.DropDownList("type", ViewBag.type as IEnumerable<SelectListItem>, new { onchange = "setDisplay();"})

    <input class="submitButton" type="submit" value="Log In" style="margin-left:126px;margin-bottom: 20px;" />
}

我在3个不同的页面上使用相同的表单,一页是日,月和年。 因此,下拉列表应默认为各自链接上的日,月或年。

我的第一个想法是使用javascript设置默认值onload。但是,问题是,如果他们点击日期页面,他们仍然可以执行一个月的日志。这不是问题,直到你意识到因为onload被调用。如果他们在页面上出现任何错误。它将默认返回默认值。因此,例如用户转到日志,但随后意识到他们想要做一个月的日志,他们将下拉列表更改为月份日志,但是用户忘记填写所需的文本框,当他们现在提交时,它将显示所需的盒子没有价值。那时它将默认返回日志日志,如果他们填写表格的其余部分并提交,他们可能没有意识到它是日志而不是月份日志。

所以我的问题是如何只在页面加载时将其设置为默认值,而不是在页面提交/ POST时设置为默认值。

1 个答案:

答案 0 :(得分:1)

假设您有一些ModelListOfItems,并且您希望ItemId成为您的下拉值,Name作为下拉文字:

@using (Html.BeginForm())
{
    @Html.CreateDropDownList(Model.ListOfItems, "DropDownListOfItems",
                             Model.ListOfItems.First(), "ItemId", "Name")
}

Model.ListOfItems.First()是您选择默认值的地方

添加了: 这是答案的重要部分:

using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class Extensions
{
    public static MvcHtmlString CreateDropDownList<T>(this HtmlHelper helper, IEnumerable<T> list, string name,
        T selectedT, string dataValue, string dataText)

    {
        return helper.DropDownList(name, new SelectList(list, dataValue, dataText, selectedT));
    }
}

已添加2:为了防止POST出现问题,您还应该使用下拉列表值填充表单,以便在POST后正确填写。

@Html.CreateDropDownList之前的某处添加此代码:

@for (var i = 0; i < Model.ListOfItems.Count; i++)
{
    @Html.HiddenFor(model => model.ListOfItems[i].ItemId)
    @Html.HiddenFor(model => model.ListOfItems[i].Name)
}