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是无状态的,所以每个请求都应该定义其状态。