Asp.net mvc 3 MVC 3下拉列表未绑定到模型

Asp.net mvc 3 MVC 3下拉列表未绑定到模型,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,在我的应用程序中,我有一个下拉列表来表示不同的选择。请注意,段落是一个模型,节只是模型中的一个字段 @Html.DropDownList("Sections") 这是我的控制器 public ActionResult Edit(int id) { var paragraph = db.Paragraphs.Find(id); ViewBag.Sections = new SelectList( db.Sections.Select(s => new {

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

@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'.
表格:(很多。)


部分
@Html.DropDownList(“节”)
专业
少数的
名称
文件

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

我会让你的下拉列表

@Html.DropDownListFor(model =>model.SectionID,(IEnumerable<SelectListItem>) ViewBag.Sections) 
文件可以是


这将为您提供要绑定的模型。你一定会得到正确的名字等回来。此外,我还将ID作为表单的一部分。

将您的HTML代码更改为:

@Html.DropDownListFor(m => m.SectionID, ViewBag.Sections as SelectList)
如果您没有此页面的模型,请使用以下代码:

@Html.DropDownList("Sections", ViewBag.Sections as SelectList)

这已经晚了,但迟做总比不做好。当您使用
HtmlHelper
提供的一个助手时,它会在幕后生成
输入
名称。此名称的生成格式为
Model.Field
。例如,带有名为“Name”字段的段落将成为
段落.Name

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


但最后,我决定接受Razor并使用内置的HTML助手。所以我的下拉列表代码看起来像:
DropDownListFor(vm=>vm.paragration.SectionID,Models.Sections)

太奇怪了!我以前用过

@Html.DropDownList("permissionsID", String.Empty)
它工作得很好——突然间,我遇到了同样的问题。 ddl未在创建(已发布)控制器方法上提交其选定的值)

所以我用

@Html.DropDownListFor(model => model.permissionID, (IEnumerable<SelectListItem>)ViewBag.permissionsID)
@Html.DropDownListFor(model=>model.permissionID,(IEnumerable)ViewBag.permissionsID)
而且效果很好

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


它真的违反了逻辑…

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

@Html.DropDownListFor(model =>model.SectionID,(IEnumerable<SelectListItem>) ViewBag.Sections) 
而且没有理由绑定父dropdownlist。因此,我所做的就是以与soon相同的方式填写家长下拉列表。创建了一个操作,在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();

     })

 });

$(文档).ready(函数(){
var URL=“/ControllerName/GetStates”;
$.getJSON(URL、函数(数据){
var项目=‘Selecione o estado’;
$。每个(数据、函数(i、状态){
项目+=“”+状态。文本+“”;
//state.Value不能包含“”字符。我们可以,因为state.Value=cnt++;
});
$('#StateList').html(项目);
//$('CitiesTrID').show();
})
});

获得了以下方面的级联示例:

我更新了我的问题(第一段),以反映一些细节。基本上,下拉列表是模型的一部分,它没有绑定到模型。你能发布视图的形式和段落模型吗?这真的很奇怪。当我不上传文件时,它适用于
GET
POST
。但是当我提供一个文件时,它会出错。你试过不同的文件吗?模型中既不包含文件,也不包含名为document的属性,因此不确定文件的存在或不存在会影响模型状态验证的原因通常是使用ViewModels和强类型帮助程序。很高兴你把它整理好了。欢迎来到这个网站-你能重新措辞一下,让它读起来更像是对手边问题的回答,而不是大声思考吗?谢谢
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();

     })

 });