繁体   English   中英

为什么 SelectList SelectedValue 在 HttpGet 上有效,但在 HttpPost 上无效?

[英]Why does SelectList SelectedValue work on HttpGet but not on HttpPost?

使用 MVC3,我发现设置 SelectList 的选定值可以正确地在 HttpGet 上呈现视图,但无法在 HttpPost 上正确呈现。 在将 Model 转发到 HttpPost 上的视图之前,我已经检查了它们并且它们正在正确更新,看来视图没有正确呈现所选标签。

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

我在这里想念什么?

Model:

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 助手总是在呈现值时使用请求中的值,然后再使用 model 中的值。 这基本上意味着,如果您想修改 POST 操作中的某些值,您需要首先将其从 model state 中删除:

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

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

在 asp.net mvc 中,selectList 的 selectedvalue 被我们使用强类型帮助器时创建下拉列表的属性的值覆盖,即

<%:Html.DropDownListFor(x=>x.SelectedWidgetID, ---,----)%>

在这种情况下,Model.selectedwidgetID 的值将覆盖在

new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM