How to bind Dictionary type parameter for both GET and POST action on ASP.NET MVC

有些话、适合烂在心里 提交于 2019-12-01 22:43:18

Don't use a dictionary for this. They don't play well with model binding. Could be a PITA.

A view model would be more appropriate:

public class MyViewModel
{
    public string Id { get; set; }
    public bool Checked { get; set; }
}

then a controller:

public class HomeController : Controller
{
    public ActionResult Index() 
    {
        var model = new[]
        {
            new MyViewModel { Id = "A", Checked = true },
            new MyViewModel { Id = "B", Checked = false },
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> model)
    {
        return View(model);
    }
}

then a corresponding view (~/Views/Home/Index.cshtml):

@model IEnumerable<MyViewModel>

@using (Html.BeginForm())
{
    <table>
        <thead>
            <tr>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @Html.EditorForModel()
        </tbody>
    </table>
    <input type="submit" value="Save" />
}

and finally the corresponding editor template (~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyViewModel
<tr>
    <td>
        @Html.HiddenFor(x => x.Id)
        @Html.CheckBoxFor(x => x.Checked)
        @Html.DisplayFor(x => x.Id)
    </td>
</tr>

Take a look at this post by scott hanselman. There're the examples of model binding to a dictionary, lists, etc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!