为表单页面设置ViewData变量的最佳方法是什么?

时间:2010-12-09 21:10:46

标签: asp.net-mvc

我想这是我们都知道的一般模式。我们有一个显示表单的操作。该表单适用于另一个操作。根据验证,我们重定向或再次显示无效表单。令人讨厌的是表单页面需要放置在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);
}

3 个答案:

答案 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。