我想这是我们都知道的一般模式。我们有一个显示表单的操作。该表单适用于另一个操作。根据验证,我们重定向或再次显示无效表单。令人讨厌的是表单页面需要放置在ViewData中的一堆变量(有些可能是复杂的数据)。这有责任在两个动作中复制代码。
你如何解决这个重复问题?一个例子可能是一个动作过滤器,以确保设置一些变量,但为每个案例定义一个新的过滤器有点矫枉过正......或者一个InitAction方法?有最好的做法吗?
public ActionResult EditSettings()
{
// Set some various variables for the view
ViewData["timezoneinfos"] = TimeZoneInfos;
ViewData["emailtemplates"] = Templates;
// Fill a SettingsForm object
return View(form);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditSettings(SettingsForm form)
{
if (ModelState.IsValid)
{
// TODO: save model
return RedirectToRoute(....);
}
// Set some various variables for the view (again)
ViewData["timezoneinfos"] = TimeZoneInfos;
ViewData["emailtemplates"] = Templates;
return View(form);
}
答案 0 :(得分:1)
过去我做过一些事情,让你的[HttpGet]
版本的动作将viewModel作为参数
[HttpGet]
public ActionResult EditSettings(SettingsForm form)
{
// Set some various variables for the view
ViewData["timezoneinfos"] = TimeZoneInfos;
ViewData["emailtemplates"] = Templates;
if( form.SomeKeyThatWouldBePopulatedOnPostBack == null )
// Fill a SettingsForm object
return View(form);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditSettings(SettingsForm form)
{
if (ModelState.IsValid)
{
// TODO: save model
return RedirectToRoute(....);
}
return EditSettings(form);
}
答案 1 :(得分:1)
我在某些情况下为避免重复而做的是覆盖OnActionExecuted
,并在那里填充ViewData
。
如果您只需要针对特定操作执行此操作,则可以查看filterContext.ActionDescriptor.ActionName
以获取已执行的操作名称。
答案 2 :(得分:0)
尽量避免使用任意键设置ViewData。您应该有一个ViewModel对象,其中包含显示View所需的所有数据。
public class EditSettingsViewModel {
public IEnumerable<TimeZoneInfo> TimeZoneInfos {get;set;}
//then your form properties etc...
}
将此模型设置为视图的视图模型。
一般来说,每个View都应该有自己的ViewModel。