【问题标题】:Html.Dropdownlist selected value is not posted back to the Controller from viewHtml.Dropdownlist 选择的值不会从视图回传到控制器
【发布时间】:2013-06-03 22:16:52
【问题描述】:

我试图在 Create.chtml 上有一个下拉列表,用户可以从下拉列表中选择一个“名称”,并且应将相应的值 (ID) 发送回控制器以将其添加到数据库表中。

工作原理:我可以在 Create.chtml 视图页面上看到带有 NAMES 的下拉列表

什么不工作:当从视图的下拉列表中选择一个 NAME 时,它的值 (ID) 不会传递给控制器​​

请查看下面的代码以确定我可能做错的地方。

Controller:

//
        // GET: /OrganizationCodes/Create

        public ActionResult Create()
        {

            var orgzList = (from x in db.TABLE_ORGANIZATIONS
                                                   select new TABLE_ORGANIZATIONSDTO
                                                   {
                                                       ID = x.ID,
                                                       NAME = x.NAME
                                                   }).OrderBy(w => w.NAME).ToList();

            ViewBag.orgz = new SelectList(orgzList, "ID", "NAME");

            return View();
        }

        public class TABLE_ORGANIZATIONSDTO
        {
            public string NAME { get; set; }
            public int ID { get; set; }
        }

        //
        // POST: /OrganizationCodes/Create

        [HttpPost]
        public ActionResult Create(TABLE_CODES dp)
        {
            try
            {
                using (var db = new IngestEntities())
                {


                    TABLE_CODES codes_temp = new TABLE_CODES();
                    ViewBag.orgz = codes_temp;

                    db.AddToTABLE_CODES(dp);
                    db.SaveChanges();
                }

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

===================================================================================
View: 'Create.chtml'

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>

         <div class="editor-field">
            @Html.DropDownList("orgz", (SelectList)ViewBag.orgz)
        </div>      

        <p>
            <input type="submit" value="Create" />
        </p>

   </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

编辑1:

编辑 2:

我正在尝试查看一个包含名称下拉列表的视图,其值为表“TABLE_ORGANIZATIONS”中的 ID,应将其添加到表“TABLE_CODES”->“MANAGER”列中作为数字

【问题讨论】:

  • 在您指定TABLE_CODES 对象的外观之前,无法回答此问题。当您将数据 POST 到控制器时,框架将尝试将您的输入模型绑定到对象类型中。
  • @Matt Houser 已经回答了您的问题。更改 DropDownList 名称 @Html.DropDownList("dp", (SelectList)ViewBag.orgz) 或操作参数名称 ActionResult Create(TABLE_CODES orgz)
  • ViewBag 在这里帮不了你。 ViewBag 只是从控制器到视图的通用数据存储。在回发期间它什么都不做,并且是空的。
  • 这是因为您的&lt;select&gt; 看起来像&lt;select id="dp.MANAGER" name="dp.MANAGER"&gt;...&lt;/select&gt;。 MVC 模型绑定会将其绑定到您的操作的dp 参数的MANAGER 属性。这样做是因为 名称匹配dp.MANAGER -> dp.MANAGER
  • 如果这是您希望变量在回发时继续的地方,那么是的,这就是您应该做的。

标签: asp.net asp.net-mvc asp.net-mvc-3 razor html-select


【解决方案1】:

在您的操作Create[HttpPost] 版本中,您希望在哪个变量中看到所选名称的值?

您已将 &lt;select&gt; 元素命名为 id = "orgz",但您的操作方法没有名为“orgz”的参数。

编辑:

当你这样做时:

@Html.DropDownList("orgz", (SelectList)ViewBag.orgz)

你最终会得到这样的 HTML:

<select id="orgz" name="orgz">...</select>

当表单被发送回控制器动作时,它会尝试找到一个名为“orgz”的变量,它将把你&lt;select&gt;元素中的选定项目放入其中。你错过了这个。

尝试更改您的[HttpPost] 版本的Create 以包含“orgz”变量:

public ActionResult Create(TABLE_CODES dp, int orgz)
{
  // orgz will contain the ID of the selected item
}

然后您的变量“orgz”将包含下拉列表中所选项目的 ID。

【讨论】:

  • @Html.DropDownList("orgz", (SelectList)ViewBag.orgz),第一个参数是要返回的表单字段的名称,而不是元素的id。在这种情况下,select 的 ID 将相同,但它与将表单值绑定到操作参数无关。
  • @MattHouser 非常感谢,马特!你真棒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多