首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Html.DropDownListFor基于ModelState而不是模型的项目选择

Html.DropDownListFor基于ModelState而不是模型的项目选择
EN

Stack Overflow用户
提问于 2014-06-24 12:57:52
回答 1查看 343关注 0票数 1

在asp.net mvc (在我的例子中是v5)中,当您将模型回发到控制器,然后使用回发模型以外的模型呈现视图时,Html.DropDownListFor将根据回发模型中的数据,而不是传递给视图的模型,选择选定的项。

为什么会这样呢?

下面是一个例子。当您在第一个下拉列表中选择一个新项时,表单会回发,如果第一个下拉列表已经选择了id=2,那么selectedId2将被更改,第二个下拉列表应该与所选的第二个条目一起呈现。然而,事实并非如此。虽然视图中的模型对象确实有新的selectedId2 =2值,但遮罩下的DropDownListFor从ViewState.ModelState对象而不是ViewState.Model获取所选的值。如何使DropDownListFor仅基于传递给视图的模型来呈现?

财务主任:

代码语言:javascript
复制
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var defaultModel = getModel();
        return View(defaultModel);
    }

    [HttpPost]
    public ActionResult Index(Model1 postedModel)
    {
        var defaultModel = getModel();

        if (postedModel.selectedId1 == 2)
        {
            defaultModel.selectedId1 = 2;
            defaultModel.selectedId2 = 2;
        }

        return View(defaultModel);
    }

    private Model1 getModel()
    {
        var items1 = new[]
        {
            new
            {
                Name = "Item 1-1",
                Id = "1"
            },
            new
            {
                Name = "Item 1-2",
                Id = "2"
            }
        };

        var items2 = new[]
        {
            new
            {
                Name = "Item 1-1",
                Id = "1"
            },
            new
            {
                Name = "Item 2-2",
                Id = "2"
            }
        };

        return new Model1
        {
            selectedId1 = 1,
            selectedId2 = 1,
            SelectList1 = new SelectList(items1, "Id", "Name", 1),
            SelectList2 = new SelectList(items2, "Id", "Name", 1)
        };
    }


}

视图模型:

代码语言:javascript
复制
public class Model1
{
    public SelectList SelectList1 { get; set; }
    public SelectList SelectList2 { get; set; }
    public int selectedId1 { get; set; }
    public int selectedId2 { get; set; }
}

观点:

代码语言:javascript
复制
@model Model1

@using (Html.BeginForm(FormMethod.Post))
{
    <div>
        @Html.DropDownListFor(m => m.selectedId1, Model.SelectList1, new { title = "Select 1", onchange = "this.form.submit();" })
        @Html.DropDownListFor(m => m.selectedId2, Model.SelectList2, new { title = "Select 2", onchange = "this.form.submit();" })
    </div>
}

编辑:一个解决方案:在执行View()之前添加这一行的清除发布的模型,以便DropDownListFor助手使用传递给视图的模型:

代码语言:javascript
复制
ViewData.ModelState.Clear();
EN

回答 1

Stack Overflow用户

发布于 2014-06-24 13:12:20

如果使用适当的SelectList构造函数,则可以指定选定的值:

SelectList构造函数(IEnumerable、String、String、Object)

最后一个参数是选定的项,它必须是IEnumerable的一个对象。

您正在使用此构造函数,但将1指定为值。应该像items1[0]一样

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24387263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档