1

在我的应用程序中,我有一个下拉列表来表示不同的选择。请注意,这Paragraph是一个模型,该部分只是模型中的一个字段。

@Html.DropDownList("Sections")

这是我的控制器。

public ActionResult Edit(int id)
{
    var paragraph = db.Paragraphs.Find(id);

    ViewBag.Sections = new SelectList(
        db.Sections.Select(s => new { s.ID, s.Name }),
        "ID", "Name", paragraph.SectionID
    );

    return View(paragraph);
}

[HttpPost]
public ActionResult Edit(Paragraph paragraph, HttpPostedFileBase document)
{
    if (ModelState.IsValid)
    {
        // Do some stuff.
    }

    ViewBag.Sections = new SelectList(
        db.Sections.Select(s => new { s.ID, s.Name }),
        "ID", "Name", paragraph.SectionID
    );

    return View(paragraph);
}

当我提交表单时,下拉列表未绑定到模型。造成ModelState.IsValid虚假,使我的生活变得可怕。有什么建议么?

编辑:当我提交表单时,我收到以下错误:

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Sections'.

编辑:当我尝试提交文件时,我似乎只收到前面的错误。

编辑:模型

public class Paragraph
{
    public int ID { get; set; }

    [Required]
    public int Major { get; set; }

    [Required]
    public int Minor { get; set; }

    [Required(ErrorMessage = "Name is required")]
    [StringLength(4000)]
    public string Name { get; set; }

    public int SectionID { get; set; }
    public virtual Section Section { get; set; }
}

形式:(很多。)

<form class="form-horizontal" action="/Paragraph/Edit" method="post" enctype="multipart/form-data">
    <fieldset>
        <div class="control-group">
            <label class="control-label" for="section">Section</label>
            <div class="controls">
                @Html.DropDownList("Sections")
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="major">Major</label>
            <div class="controls">
                <input type="number" class="input-large" name="major" value="@Model.Major" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="minor">Minor</label>
            <div class="controls">
                <input type="number" class="input-large" name="minor" value="@Model.Minor" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="name">Name</label>
            <div class="controls">
                <input type="text" class="input-large" name="name" value="@Model.Name" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="document">Document</label>
            <div class="controls">
                <input type="file" class="input-file" name="document" />
            </div>
        </div>
        <div class="form-actions">
            <input type="submit" class="btn btn-primary" value="Save" />
            <a class="btn" href="/Paragraph/Show/@Model.ID">Cancel</a>
        </div>
    </fieldset>
</form>
4

5 回答 5

1

只是想知道为什么不使用 Html.TextBoxFor 等强类型助手?如果需要,您可以传递可选的 html 属性

我会做你的下拉列表

@Html.DropDownListFor(model =>model.SectionID,(IEnumerable<SelectListItem>) ViewBag.Sections) 

其他

@Html.HiddenFor(model =>model.ID)
@Html.TextBoxFor(model =>model.Name)
@Html.TextBoxFor(model =>model.Major)
@Html.TextBoxFor(model =>model.Minor)

文件可以<input type="file" class="input-file" name="document" />

那应该为您提供要绑定的模型。您一定会得到正确的名称等。此外,我将 ID 作为表格的一部分。

于 2012-04-15T21:47:18.457 回答
1

将您的 HTML 代码更改为:

@Html.DropDownListFor(m => m.SectionID, ViewBag.Sections as SelectList)

如果您没有此页面的模型,请使用以下代码:

@Html.DropDownList("Sections", ViewBag.Sections as SelectList)
于 2012-04-16T01:20:05.580 回答
0

这已经晚了,但迟到总比没有好。当您使用它提供的助手之一时,它会在后台HtmlHelper生成名称。input此名称的生成格式为Model.Field. 例如,带有“名称”字段的段落将变为Paragraph.Name.

接受一个参数的定义DropDownList使用下拉列表的名称作为input虽然的名称。因此,调用DropDownList("Sections")将创建input一个名为“Sections”的名称。

但最后,我决定让步给 Razor 并使用内置的 HTML 帮助程序。所以我的下拉列表代码如下所示DropDownListFor(vm => vm.Paragraph.SectionID, Models.Sections)

于 2012-04-26T00:14:37.247 回答
0

太奇怪了!我以前用

@Html.DropDownList("permissionsID", String.Empty)

它工作正常 - 突然间,我收到了同样的问题。ddl 未在 Create (posted) 控制器方法上提交其选定的值)

所以我用

@Html.DropDownListFor(model => model.permissionID, (IEnumerable<SelectListItem>)ViewBag.permissionsID)

效果很好!

但是,我的旧控制器直到今天仍然使用旧方法工作 - 只是它不喜欢我的新控制器!

实在是太不合逻辑了……

于 2013-01-21T15:25:09.190 回答
0

朋友在做级联下拉列表时遇到了同样的问题

并且没有为什么要绑定父下拉列表。所以我所做的就是以与很快相同的方式填充父下拉列表。创建了一个动作,在 json 上调用它并使用 jquery 填充它。

我对控制器的操作:

public ActionResult GetStates()
    {
        if (Request.IsAjaxRequest())
        {
            using (MyModel banco = new myModel())
            {

                return Json(new SelectList(banco.SyStates.ToList(), "StateId", "StateName"), JsonRequestBehavior.AllowGet);

            }
        }
        return View();

    }

风景:

      <select id="StateList" name="StateList"></select> 

<script>

   $(document).ready(function () {



         var URL = "/ControllerName/GetStates";
         $.getJSON(URL, function (data) {



         var items = '<option>Selecione o estado</option>';
         $.each(data, function (i, State) {
             items += "<option value='" + State.Value + "'>" + State.Text + "</option>";
             // state.Value cannot contain ' character. We are OK because state.Value = cnt++;

         });
         $('#StateList').html(items);
         //$('#CitiesTrID').show();

     })

 });

得到级联示例:http: //blogs.msdn.com/b/rickandy/archive/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx

于 2014-02-27T23:38:26.790 回答