从Form.Submit客户端操作返回视图模型到控制器

时间:2011-06-07 20:36:58

标签: c# asp.net-mvc-3 viewmodel

我有一个带有2种索引方法的控制器:

public ActionResult Index()
{
    viewModel.PipelineIndex pivm = new viewModel.PipelineIndex(null, User.Identity.Name);
    return View(pivm);
}

[HttpPost]
public ActionResult Index(viewModel.PipelineIndex model, FormCollection collection)
{
    viewModel.PipelineIndex pivm = null;
    if (ModelState.IsValid)
    {
        string key = collection.AllKeys[0];
        string ID = collection.Get(key).ToString();
        pivm = new viewModel.PipelineIndex(ID, User.Identity.Name);
    }
    else
        pivm = new viewModel.PipelineIndex(null, User.Identity.Name);

    return View(pivm);

}

我使用的ViewModel是一个定义良好的类:

public class PipelineIndex
{
    private Models.Context _db = new Models.Context();

    public List<SelectListItem> GroupList { get; set; }
    public List<string> ButtonCaptions { get; set; }
    public List<ContactDetail> ContactList { get; set; }
    public string PageTitle { get; set; }
    ...

View使用ViewModel设置Grid和Drop Down控件:

@model BlueSkies.Pipeline.ViewModels.PipelineIndex
@{ ViewBag.Title = "Index"; }
@using (Html.BeginForm()) 
{
    <h2>@Model.PageTitle</h2>
    <div style="clear:both">
        @if (Model != null)
        {
            var grid = new WebGrid(canPage: true, rowsPerPage: 15, canSort: true, ajaxUpdateContainerId: "grid");
            grid.Bind(Model.ContactList, rowCount: Model.ContactList.Count, autoSortAndPage: true);
            grid.Pager(WebGridPagerModes.All);
            @grid.GetHtml(htmlAttributes: new { id = "grid" },
            columns: grid.Columns(
                grid.Column(format: (item) => Html.ActionLink("View", "Details", "Contacts", new { ID = item.Name }, null)),
                grid.Column(format: (item) => Html.ActionLink("Edit", "Edit", "Contacts", new { ID = item.Name }, null)),
                grid.Column("Name"),
                grid.Column(columnName: "Phone1", header: "Phone")
            ));
        }
    </div>
    <hr />
    <div>
        @*foreach (string caption in ViewBag.ButtonCaptions)
        { 
            @Html.ActionLink(caption, "Index", "Pipeline", new { ID = caption }, new { @class = "menuSubButton" })
        }*@
        @Html.DropDownList("GroupDropDown", Model.GroupList, new { @onchange = "this.form.submit()" }) &nbsp; Select a pipe section...
    </div>
}

当我遇到挑战时,Drop Down会触发Form.Submit(在onChange事件上)。没有模型返回到我的控制器。我确实有FormCollection但我宁愿在下拉列表中包含更新的模型,包括新的selectedItem。我错过了什么?是的,我正在寻找一个基于非JS 的解决方案 - 或者尽可能接近我。我不想在这个页面上播放AJAX。

TIA

注意:有一个similar question here。它是基于AJAX的,但在调用控制器时获得相同的null模型。为什么找到正确的答案很难? :)

2 个答案:

答案 0 :(得分:0)

我精神上很疲惫,所以我添加了这个免责声明。思考回答一个问题会让我远离我的一天。

业务问题似乎是“从下拉列表中选择一个项目并相应地呈现内容”。如果这是正确的,则无需传回视图模型的全部内容;你只需要传回id,这在许多网站上多次演示。

我错过了什么吗?

答案 1 :(得分:0)

我认为呈现的HTML表单会有一个名为“GroupDropDown”的select,是吗?如果是这样,所选值将在使用该名称提交时回发,并且将绑定到名为groupDropDown的参数或模型类上的字符串属性GroupDropDown。你的模特有这样的属性吗?