Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 5 Viewmodel创建两次_Asp.net Mvc 5 - Fatal编程技术网

Asp.net mvc 5 Viewmodel创建两次

Asp.net mvc 5 Viewmodel创建两次,asp.net-mvc-5,Asp.net Mvc 5,我将LoginViewModel的实例传递给我的视图(登录) 当我单击表单上的submit按钮时,会创建LoginViewModel的另一个实例。 我可以观察到这一点,因为我在构造函数中放置了一个断点 为什么会发生这种情况?我如何修复它 @using ViewModels @model LoginViewModel <form action="~/Home/VerifyLogin" method="post"> <table> <t

我将LoginViewModel的实例传递给我的视图(登录) 当我单击表单上的submit按钮时,会创建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 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;
    }
}
public类LoginViewModel:BaseViewModel
{
公共IEnumerable用户{get;private set;}
公共IEnumerable用户列表{get;private set;}
public int SelectedUserID{get;set;}
公共字符串SelectedPassword{get;set;}
公共登录视图模型()
{
Users=DataService.GetUsers();
UserList=新的SelectList(用户,“ID”,“名称”);
}
公共bool登录(字符串用户名、字符串密码)
{
返回true;
}
}
这里创建了一个

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
}
public ActionResult RedirectToLogin()
{
    var vm = new LoginViewModel()
    {
        Users = DataService.GetUsers();
        UserList = new SelectList(Users, "ID", "Name"); 
    };

    return View("Login", vm);
}

public LoginViewModel()
{
    //Removed code
}