Asp.net mvc 3 自动将视图模型指定给控制器中的每个动作

Asp.net mvc 3 自动将视图模型指定给控制器中的每个动作,asp.net-mvc-3,Asp.net Mvc 3,我想在控制器里做这个 protected override void OnActionExecuted(ActionExecutedContext filterContext) { (filterContext.Result as ViewResultBase).Model = BindViewModel(); base.OnActionExecuted(filterContext); } 。。。。但模型并没有设置器 我的想法是

我想在控制器里做这个

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

        base.OnActionExecuted(filterContext);
    }
。。。。但模型并没有设置器

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


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

我将尝试用一个示例来回答您的问题(后面是一个小的解释)

让我们将模型定义为

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; }
}
公共类测试模型
{
公共字符串SelectedItem{get;set;}
公共IEnumerable下拉项
{
得到
{
if(Items==null)
返回null;
returnitems.Select(i=>newselectListItem{Text=i,Value=i});
}
}
公共IEnumerable项{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);
    }
[HttpGet]
公共行动结果索引()
{
TestModel model=新的TestModel();
model.Items=新列表{“A”,“B”};
返回视图(模型);
}
[HttpPost]
公共行动结果索引(TestModel)
{
返回视图(模型);
}
现在看来,

@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>
}
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
测试模型
@LabelFor(model=>model.SelectedItem)
@对于(int i=0;im.SelectedItem,Model.dropdownlitems)
@Html.ValidationMessageFor(model=>model.SelectedItem)

}
说明:


模型具有IEnumerable Items类型的属性,该属性将填充属性DropdownItems。在视图中,我们可以设置项目的隐藏字段,以便在每个post请求中填充该字段。因此,我们无需再次设置它。

为什么不想使用返回视图(“MyView”,BindViewModel())?在post请求模型状态中,保留其状态,因此无需再次设置下拉列表。(前提是您没有清除模型状态)。但您是否希望在重定向后保留下拉列表。@EvgenyLevin我现在就是这么做的,但它的代码重复。@Manas我不是在说选定的索引。我说的是可供选择的项目列表。您对每个操作使用相同的视图吗?这就像WebForms的viewstate一样。谢谢你花时间告诉我怎么做,但这有点离题了,不是吗?所有这些代码和更大的web请求只是为了避免写两次“View”(“MyView”,BindViewModel())!是的,因为HTTP是无状态的,所以每个请求都应该定义其状态。