我想在控制器中执行此操作...
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
(filterContext.Result as ViewResultBase).Model = BindViewModel();
base.OnActionExecuted(filterContext);
}
....但是模特没有制定者。
我的想法是我的视图(这是一个完成后重定向的表单)需要将相同的数据集添加到下拉列表中,无论是第一个请求还是帖子后退。所以我不想重复绑定下拉列表数据的代码。
有什么想法吗?我正在尝试重新创建一个我用于WebForms和列表页面的模式,我将保留绑定代码直到PreRender,所以无论在页面生命周期的早期采取什么操作,都会有一个新的绑定在结束时页。
答案 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请求中填充它。所以我们不需要再次设置它。