asp.net-mvc - 为什么 SelectList SelectedValue 在 HttpGet 上有效,但在 HttpPost 上无效?

标签 asp.net-mvc asp.net-mvc-3 html-select selectlist

使用 MVC3,我发现设置 SelectList 的选定值可以正确呈现 HttpGet 上的 View ,但无法在 HttpPost 上正确呈现。在将模型转发到 HttpPost 上的 View 之前,我已经检查了模型,并且它们正在正确更新,只是 View 似乎没有正确渲染所选标签。

在 HttpPost 上,<select>完全按照任何编辑后但提交表单之前的状态呈现。 m.SelectedWidgetId = 2;在HttpPost方法执行时,更新了model,但是没有体现在View中。

我在这里缺少什么?

型号:

public class WidgetModel
{
    private Widget[] Widgets {
        get
        {
            return new Widget[] { 
                new Widget { Id=1, Name="Item 1" },
                new Widget { Id=2, Name="Item 2" },
                new Widget { Id=3, Name="Item 3" }
            };
        }
    }
    public SelectList WidgetList
    {
        get
        {
            return new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);
        }
    }
    public int SelectedWidgetId { get; set; }
}

查看:

@model thisProject.Models.WidgetModel

@using (Html.BeginForm())
{
    @Html.DropDownListFor(m => m.SelectedWidgetId, Model.WidgetList, "Select...");      
    <input type='submit' />                                                                                    
}

Controller 方法;

public ActionResult Widget()
{
    var m = new WidgetModel();
    m.SelectedWidgetId = 1;
    return View(m);
}
[HttpPost]
public ActionResult Widget(WidgetModel m)
{
    m.SelectedWidgetId = 2;
    return View(m);
}

最佳答案

发生这种情况是因为 HTML 帮助程序在渲染值时始终先使用请求中的值,然后再使用模型中的值。这基本上意味着,如果您想修改 POST 操作中的某些值,您需要首先将其从模型状态中删除:

[HttpPost]
public ActionResult Widget(WidgetModel m)
{
    ModelState.Remove("SelectedWidgetId");
    m.SelectedWidgetId = 2;
    return View(m);
}

或者助手将忽略您手动设置的值并使用用户发布的值。

关于asp.net-mvc - 为什么 SelectList SelectedValue 在 HttpGet 上有效,但在 HttpPost 上无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5893185/

相关文章:

c# - 设置 View 的文本框(日期时间字段)以显示只读当前日期时间

visual-studio-2010 - 如何为 RedirectToAction 创建扩展?

c# - 如何在mvc中映射多个路由

jquery - 防止选择下拉菜单在 FireFox 和 Opera 中打开

javascript - "old browsers"中的 HTML 选择值

asp.net-mvc - 路由约束到特定文件类型

asp.net-mvc - MVC Web 应用程序数据库由用户权限驱动的菜单

c# - 如何在 ASP.NET MVC 中设置来自模型的下拉列表的值

ASP.Net/Ruby/PHP MVC 网站、jQuery Mobile 和 Phonegap

html - 多选选项 RTL 对齐问题