C# 这似乎很糟糕。如何做到这一点?Asp.NETMVC和下拉列表

C# 这似乎很糟糕。如何做到这一点?Asp.NETMVC和下拉列表,c#,asp.net-mvc-2,drop-down-menu,C#,Asp.net Mvc 2,Drop Down Menu,我正在学习MVC,并在我的新用户注册表中使用MVC应用程序的下拉列表 对于我的大多数屏幕,我有两种控制器方法。一个用于GET(屏幕的初始显示),另一个用于POST(当用户单击Submit按钮时) 代码如下: public ActionResult UserRegistration() { SelectList list = new SelectList(SiteUserRepository.GetTimezones(), "timezone_id", "l

我正在学习MVC,并在我的新用户注册表中使用MVC应用程序的下拉列表

对于我的大多数屏幕,我有两种控制器方法。一个用于GET(屏幕的初始显示),另一个用于POST(当用户单击Submit按钮时)

代码如下:

        public ActionResult UserRegistration()
    {
        SelectList list = new SelectList(SiteUserRepository.GetTimezones(), "timezone_id", "location");
        ViewData["timezones"] = list;
        return View();
    }

    [HttpPost]
    public ActionResult UserRegistration(SiteUserModels.SiteUserRegistrationModel model)
    {
        if (ModelState.IsValid)
        {
            SiteUserRepository.CreateUser(model.username, model.email, model.password, model.firstname, model.firstname, model.timezone_id);
            return RedirectToAction("Index", "Home");
        }
        SelectList list = new SelectList(SiteUserRepository.GetTimezones(), "timezone_id", "location");
        ViewData["timezones"] = list;
        return View();
    }
请注意,我正在复制和发布代码。正在复制下拉列表(选择列表)的代码。我发现ViewData仅可用于初始请求,因此我需要为Post重做它(如果用户输入了无效数据,屏幕将返回..)


有更好的方法吗?

在您的案例中,返回非post操作的ActionResult应该可以

[HttpPost]
public ActionResult UserRegistration(SiteUserModels.SiteUserRegistrationModel model)
{
    if (ModelState.IsValid)
    {
        SiteUserRepository.CreateUser(model.username, model.email, model.password, model.firstname, model.firstname, model.timezone_id);
        return RedirectToAction("Index", "Home");
    }
    return UserRegistration();
}

通常,您希望通过附加数据向视图提供一些错误报告。在这种情况下,您需要将SelectList创建重构为一个单独的方法,以避免冗余。

Perfect!谢谢你指出这一点。工作100%。下一步将添加错误检查。