【问题标题】:c# MVC Dropdownlist post selected valuec# MVC Dropdownlist post selected value
【发布时间】:2015-08-13 09:43:30
【问题描述】:

首先让我这样说:我查看了多个答案,但我似乎无法完全理解它 - 可能我只是脑残。但这是我的问题:

我的问题专门针对下拉列表:使用硬编码值:今天、月份、年份。

每当我在下拉列表中选择某些内容时,我都想将值发布/提交,例如“今天”到控制器。我该怎么做?

感谢您的宝贵时间。

@using (Html.BeginForm("DisplayDetails", "Client"))
{
    @*Start of searchBox*@
    <div id="searchBox">
        Enter client e-mail: <input id="txtUser" type="text" name="clientID" /> <input id="btnFind" type="submit" />
    </div>
    @*<--- End of searchBox --->*@

    if (Model != null)
    {
        @*Start of infobox and wrapper*@
        <div id="infoBoxWrapper">
            <div class="infoBox">
                <fieldset>
                    <legend style="padding: 0.2em 0.5em; border: 1px solid black; font-size: large;"> Client info </legend>

                    <table>
                        <tr>
                            <td> <b> First name: </b></td>
                            <td>
                                @Html.DisplayFor(m => m.FName)
                            </td>

                        </tr>
                        <tr>
                            <td> <b> Last name: </b></td>
                            <td> @Html.DisplayFor(m => m.LName) </td>
                        </tr>
                        <tr>
                            <td> <b> Phone: </b></td>
                            <td> @Html.DisplayFor(m => m.Phone)</td>
                        </tr>
                        <tr>
                            <td> <b> E-mail: </b></td>
                            <td> @Html.DisplayFor(m => m.UserID) </td>
                        </tr>
                    </table>

                </fieldset>
            </div>
            @*<--- End of infobox --->*@

            @*Start of recordsBox*@
            <div id="recordsBox">
                <fieldset>
                    <legend style="padding: 0.2em 0.5em; border: 1px solid black; font-size: large;"> Records </legend>
                    <table>
                        <tr>
                            <td> <b>Time</b></td>
                            <td> <b>Systolic</b> </td>
                            <td> <b>Diastolic</b> </td>
                            <td> <b>Pulse</b> </td>
                        </tr>
                        @for (int i = 0; i < Model.Records.Count; i++)
                        {
                            string style = null;
                            if (Model.Records[i].Score == 1) { style = "background-color:green"; }
                            else if (Model.Records[i].Score == 2) { style = "background-color:blue"; }
                            else if (Model.Records[i].Score == 3) { style = "background-color:yellow"; }
                            else if (Model.Records[i].Score == 4) { style = "background-color:orange"; }
                            else if (Model.Records[i].Score == 5) { style = "background-color:red"; }

                            <tr style="@style">
                                <td>
                                    @Model.Records[i].Time
                                </td>
                                <td>
                                    @Html.DisplayFor(m => m.Records[i].Systolic)
                                </td>
                                <td>
                                    @Html.DisplayFor(m => m.Records[i].Diastolic)
                                </td>
                                <td>
                                    @Html.DisplayFor(m => m.Records[i].Pulse)
                                </td>
                            </tr>
                        }
                    </table>
                </fieldset>
            </div>
        </div>
        @*<--- End of infobox wrapper --->*@

        @*Start of chartbox*@
        <div id="chartWrapper">
            <div id="comboBox">
                <select id="dpChoice">
                    <option value="today">Today</option>
                    <option value="month">This month</option>
                    <option value="year">This year</option>
                </select>
            </div>
            <div id="chartbox">
                @Model.Chart
            </div>
        </div>
        @*<--- End of chartbox --->*@
    }
    else
    {
        <label> Search for a client...</label>
    }
}

【问题讨论】:

  • This SO question might help它显示了如何在选择下拉列表中的项目时使POST到控制器。您在研究期间读过这篇文章吗?

标签: c# asp.net-mvc razor drop-down-menu


【解决方案1】:

您的选择没有name 属性,因此它不会在表单数据中发送。改成(说)

<select name="choice">
  ...
</select>

根据是否选择了第一个选项,它将回发choice: today,您可以通过将参数string choice 添加到您的POST 方法来访问它。但是我强烈建议您使用视图模型,包括

public class MyViewModel
{
  public int ClientEmail{ get; set; }
  public string Choice { get; set; }
  public IEnumerable<SelectListItem> ChoiceList { get; set; }
  ....
}

并在控制器中填充集合

model.ChoiceList = new List<SelectListItem>()
{
  new SelectListItem(){ Value = "today", Text = "Today" },
  new SelectListItem(){ Value = "month", Text = "This month" },
}

然后在视图中

@Html.TextBoxFor(m => m.ClientEmail)
....
@Html.DropDownListFor(m => m.Choice, Model.ChoiceList)

然后将视图模型回传到控制器

【讨论】:

  • 这帮助我理解了一点,尽管它主要是发布导致我出现问题。我使用过 viewdata/viewbag/tempdata,但它似乎不是我想要的。该模型包括一个具有多条记录的客户端。记录基于下拉列表(日、月和年)。我想根据选择的选项更新记录,但不是客户端
  • 那么如果你不改变它,文本框是什么?您是否要根据所选选项过滤记录表?如果是这样,您的控制器方法应该是public ActionResult DisplayDetails(string choice) { ...},正如我在答案中指出的那样。然后将表单更改为BeginForm("DisplayDetails", "Client", FormMethod.Get)。当您提交时,choice 的值将是所选选项的值,因此您可以过滤数据并返回视图。但是,如果您使用 ajax 仅更新当前页面而不是重新生成整个视图,则会大大提高性能。
  • 我使用文本框来查找特定的客户,它只是一个搜索字段。控制器当前看起来如您所说,除了它还需要一个客户端 ID。我确实想使用 Ajax,但我没有使用经验,这可能也是我困惑的原因。感谢您的帮助。
  • 强烈建议您开始学习 javascript/jquery/ajax(它绝对是当今编写 Web 应用程序的基础),并且执行此操作的代码只有 4 行代码 :)
  • 毫无疑问。我大多习惯于在 asp.net 中工作,因此了解 MVC 的概念有点棘手,而且如果不了解如何使用 Ajax/jquery,这有点棘手,尤其是当您刚刚进入一个项目时:p
猜你喜欢
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多