9

从这里阅读:ASP.NET MVC

动作SelectCategory已在控制器内部创建 -

 public ActionResult SelectCategory() {

     List<SelectListItem> items = new List<SelectListItem>();    
     items.Add(new SelectListItem { Text = "Action", Value = "0"});    
     items.Add(new SelectListItem { Text = "Drama", Value = "1" });    
     items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true });    

     ViewBag.MovieType = items;

     return View();    
 }

我无法理解下一行中的数据绑定。

@Html.DropDownList("MovieType")

在以类似方式绑定数据的同时,

@Html.DropDownList("IdList");

我收到以下错误-

没有具有键“IdList”的“IEnumerable”类型的 ViewData 项。

控制器动作

public ActionResult SelectId()
    {
        List<SelectListItem> items = new List<SelectListItem>();
        items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true });
        items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" });

        ViewBag.IdList = items;
        return View();
    }

我错过了什么?感谢您的帮助 !

4

3 回答 3

22

您已设置ViewBag.MovieType=>,当您使用@Html.DropDownList("MovieType")下拉菜单时将使用此值。当您编写@Html.DropDownList("IdList")时,助手在 ViewBag 中找不到相应的IdList属性并抛出错误,因为它不知道从哪里绑定数据。

或者,如果您想更改下拉列表的名称,您可以使用以下内容:

@Html.DropDownList("SelectedMovieType", (IEnumerable<SelectListItem>)ViewBag.MovieType)

并且您的 POST 操作将有一个SelectedMovieType参数来检索所选值。

但我会避免使用 ViewBag。定义视图模型更好:

public class MyViewModel
{
    public string SelectedMovieType { get; set; }
    public IEnumerable<SelectListItem> MovieTypes { get; set; }
}

然后让您的控制器操作填充此视图模型并将其传递给视图:

public ActionResult SelectId()
{
    List<SelectListItem> items = new List<SelectListItem>();
    items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true });
    items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" });

    var model = new MyViewModel
    {
        MovieTypes = items    
    };

    return View(model);
}

在您的强类型视图中:

@model MyViewModel
@Html.DropDownListFor(x => x.SelectedMovieType, Model.MovieTypes)
于 2012-10-20T07:09:56.873 回答
3

在将您的列表绑定到 DropDown 时,您需要在使用 @Html.DropDown 控件时将其类型转换为 IEnumerable,该控件不是使用 Model 进行强类型的

在视图中

@Html.DropDownList("MovieType",(IEnumerable<SelectListItem>)ViewBag.MovieType) 

如果您绑定 IdList 则另一种方式

@Html.DropDownList("IdList",(IEnumerable<SelectListItem>)ViewBag.IdList)
于 2012-10-20T06:35:37.203 回答
1

数据绑定将数据绑定到模型的一种无痛方式:不要将剃须刀用于 Dropdown。手动绑定,用 FormCollection 对象获取。

控制器:

 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Sorun sorun,FormCollection fc)
    {
        //Define independently as form collection

        sorun.GonderilecekBirim = fc["GonderilecekBirim"];
        sorun.IlkSorulmaTarihi = DateTime.Now;
        if (ModelState.IsValid)
        {

            db.Soruns.Add(sorun);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(sorun);
    }

看法

@Html.LabelFor(model => model.GonderilecekBirim, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            <!-- Define as raw html -->
            <select id="GonderilecekBirim" name="GonderilecekBirim">
                <option value="4">Satın Alma</option>
                <option value="5">Muhasebe</option>
            </select>

            @*@Html.ValidationMessageFor(model => model.GonderilecekBirim, "", new { @class = "text-danger" })*@
        </div>
于 2016-07-27T12:02:24.397 回答