自动将视图模型分配给控制器中的每个操作

时间:2012-03-03 16:12:57

标签: asp.net-mvc-3

我想在控制器中执行此操作...

        protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        (filterContext.Result as ViewResultBase).Model = BindViewModel();

        base.OnActionExecuted(filterContext);
    }

....但是模特没有制定者。

我的想法是我的视图(这是一个完成后重定向的表单)需要将相同的数据集添加到下拉列表中,无论是第一个请求还是帖子后退。所以我不想重复绑定下拉列表数据的代码。

有什么想法吗?我正在尝试重新创建一个我用于WebForms和列表页面的模式,我将保留绑定代码直到PreRender,所以无论在页面生命周期的早期采取什么操作,都会有一个新的绑定在结束时页。

1 个答案:

答案 0 :(得分:0)

我将尝试用一个例子回答你的问题(然后是一个小的解释)

让我们将模型定义为,

public class TestModel
{
    public string SelectedItem { get; set; }

    public IEnumerable<SelectListItem> DropdownItems
    {
        get
        {
            if (Items == null)
                return null;
            return Items.Select(i => new SelectListItem { Text = i, Value = i });
        }
    }

    public IEnumerable<string> Items { get; set; }
}

在控制器中,

    [HttpGet]
    public ActionResult Index()
    {
        TestModel model = new TestModel();
        model.Items = new List<string> { "A", "B" };

        return View(model);
    }
    [HttpPost]
    public ActionResult Index(TestModel model)
    {
        return View(model);
    }

现在在视图中,

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
    <legend>TestModel</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.SelectedItem)
    </div>
    <div class="editor-field">
    @for (int i = 0; i < Model.Items.Count(); i++)
    {
        @Html.Hidden("Items["+i+"]",Model.Items.ElementAt(i))
    }
        @Html.DropDownListFor(m=>m.SelectedItem,Model.DropdownItems)
        @Html.ValidationMessageFor(model => model.SelectedItem)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
    </fieldset>
}

说明:

Model具有IEnumerable Items类型的属性,它将填充属性DropdownItems。在视图中,我们可以为Items设置隐藏字段,以便在每个post请求中填充它。所以我们不需要再次设置它。