【问题标题】:MVC Html.DropDownList selected value being overriden by QueryString valueMVC Html.DropDownList 选择的值被 QueryString 值覆盖
【发布时间】:2011-08-09 17:44:24
【问题描述】:

我在我的视图中使用下拉列表,如下所示:

@Html.DropDownList("ClientId", Model.AvailableClients, "-- None --")

Model.AvailableClients 是一个 IEnumerable 之一,项的 Selected 属性设置为 true。如果页面请求的查询字符串中包含“ClientId=”(如未设置),MVC 将忽略我选择的项目。我认为这是因为 MVC 试图提供帮助并使用查询字符串自动设置所选项目,但我不想要这个。

如何防止查询字符串值覆盖我的项目的选定值?

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    如果您为 DropDownList 指定的名称已经是模型中元素的名称,则 DropDownList 将自动用模型值覆盖所选值。如果让 ClientId 确定所选值不是一个选项,那么我知道的唯一解决方案是使用模型中未包含的名称重命名 DropDownList。

    @Html.HiddenFor(m => m.ClientId)
    @Html.DropDownList("ClientIdNewName", Model.AvailableClients, "-- None --", new { onchange = "ClientId.value = this.value"})
    

    这将保留 ClientId 中的值,而不使其成为默认选择值。

    【讨论】:

    • 我需要能够覆盖它,以便如果用户请求的 ClientId 不存在或他们无权访问代码,则可以选择适当的替代方法
    • @Mr Bell 您不能将 ClientId 设置为控制器中的适当替代项吗?或者在您的 Model.AvailableClients 中设置适当的替代选定项,然后为下拉列表使用不同的名称?
    • 如果您为下拉菜单使用不同的名称,则模型在回发到控制器时将无法正确填充。如果您将该字段分离到另一个字段中,那么您的初始对象验证将不起作用
    • @Mr Bell 编辑了答案。找到了一种方法来保留 ClientId 字段而不使用它作为默认值。我测试了我的代码,它可以工作。
    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2021-03-08
    • 1970-01-01
    • 2016-12-27
    • 2013-09-02
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    相关资源
    最近更新 更多