Html.DropDownList用于选择基于ModelState而非Model的项目

时间:2014-06-24 12:57:53

标签: asp.net asp.net-mvc asp.net-mvc-5

在asp.net mvc(在我的情况下为v5)中,当您将模型发布回控制器,然后使用除了回发的模型之外的模型呈现视图 , Html.DropDownListFor将根据发回的模型中的数据选择所选项目,而不是传递给视图的模型。

为什么会这样?

这是一个例子。当您在第一个下拉列表中选择一个新项目时,表单会回发,如果第一个下拉列表选择了id = 2,那么selectedId2将被更改,第二个下拉列表呈现,并选择第二个项目。然而事实并非如此。虽然视图中的Model对象具有新的selectedId2 = 2值,但引擎盖下的DropDownListFor从ViewState.ModelState对象获取所选值,而不是ViewState.Model。可以做些什么来使DropDownListFor仅基于传递给视图的模型进行渲染?

控制器:

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)
        };
    }


}

视图模型:

public class Model1
{
    public SelectList SelectList1 { get; set; }
    public SelectList SelectList2 { get; set; }
    public int selectedId1 { get; set; }
    public int selectedId2 { get; set; }
}

观点:

@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帮助程序使用传递给视图的模型:

ViewData.ModelState.Clear();

1 个答案:

答案 0 :(得分:1)

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

SelectList Constructor (IEnumerable, String, String, Object)

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

您正在使用此构造函数,但指定1作为值。它应该类似于items1[0]