Viewmodel创建两次

时间:2014-09-12 00:15:44

标签: asp.net-mvc-5

我将LoginViewModel的实例传递给我的视图(登录) 当我单击表单上的提交按钮时,会创建另一个LoginViewModel实例。 我可以观察到这一点,因为我在构造函数中放了一个断点。

为什么会发生这种情况,我该如何解决?

@using ViewModels

@model LoginViewModel


<form action="~/Home/VerifyLogin" method="post">  
    <table>
        <tr>
            <td>
                User Name:
            </td>

            <td>
                @Html.DropDownListFor(m => m.SelectedUserID, Model.UserList);
            </td>
        </tr>

        <tr>
            <td>
                Password:
            </td>

            <td>
                @Html.TextAreaFor(m => m.SelectedPassword);
            </td>
        </tr>

        <tr>
            <td colspan="2">
                <input type="submit" value ="Login" />
            </td>
        </tr>
    </table>
</form> 

控制器

public class HomeController : Controller
{
    //
    // GET: /Home/
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult RedirectToLogin()
    {
        return View("Login", new LoginViewModel());
    }

    [HttpPost]
    public void VerifyLogin(LoginViewModel vm)
    {
        bool sucess = false;

        // some logic

        if(sucess)
            RedirectToAction("ProjectList", "Project");


}

视图模型

public class LoginViewModel :BaseViewModel
{
    public IEnumerable<User> Users { get; private set; }
    public IEnumerable<SelectListItem> UserList { get; private set; }

    public int SelectedUserID { get; set; }
    public string SelectedPassword { get; set; }

    public LoginViewModel()
    {
        Users = DataService.GetUsers();
        UserList = new SelectList(Users, "ID", "Name"); 
    }

    public bool Login(string userName, string password)
    {
        return true;
    }
}

1 个答案:

答案 0 :(得分:1)

在这里创建了一个......

return View("Login", new LoginViewModel());

这里创建了一个

public void VerifyLogin(LoginViewModel vm)

模型绑定器创建对象并使用从请求接收的参数填充它们。这是正常的操作。

为了解决你的问题,我会这样做......

public ActionResult RedirectToLogin()
{
    var vm = new LoginViewModel()
    {
        Users = DataService.GetUsers();
        UserList = new SelectList(Users, "ID", "Name"); 
    };

    return View("Login", vm);
}

public LoginViewModel()
{
    //Removed code
}