如何将文本框\输入值从视图传递到MVC中的控制器

时间:2015-08-06 08:16:03

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我的视图中有以下输入,我想将它们传递给控制器​​:

<div>
     <span><label>Username</label></span>
     <span><input type="text" class="textbox" id="username"></span>
</div>
<div>
      <span><label>Password</label></span>
      <span><input type="password" class="password" id="password"></span>
</div>

这是我的控制器方法,以便对特定用户进行身份验证:

public ActionResult LoginMethod(string username, string password)
{
    if (username == "admin" && password == "admin1")
    {
       return RedirectToAction("Home");
    }
    else 
    {
       return RedirectToAction("Login");
    }
}

3 个答案:

答案 0 :(得分:4)

如果您想保持控制器操作并查看相同内容,只需添加name属性以匹配您的操作参数,他们就会传递数据:

<input type="text" class="textbox" id="username" name="username">
<input type="password" class="password" id="password" name="password">

但是我建议使用强类型视图模型,因为错误的空间较小,可以更好地使用框架。

为此,您需要执行以下操作:

创建一个包含属性的类,并为标签添加DisplayName属性:

public class FooViewModel 
{
   [DisplayName("Username")]
   public string Username { get; set; }
   [DisplayName("Password")]
   public string Password { get; set; }
}

向视图添加模型指令,并使用HtmlHelpers代替html输入:

@model FooViewModel
<div>
    <span>@Html.LabelFor(x => x.Username)</span>
    <span>@Html.TextBoxFor(m=> m.Username)</span>
</div>
<div>
    <span>@Html.LabelFor(x => x.Password)</span>
    <span>@Html.PasswordFor(m=> m.Password)</span>
</div>

然后将您的操作更改为:

public ActionResult LoginMethod(FooViewModel model)
{
   if (model.Username == "admin" && model.Password == "admin1")
   {
     return RedirectToAction("Home");
   }
  else 
  {
     return RedirectToAction("Login");
  }
}

答案 1 :(得分:1)

通常最好使用viewmodel将数据发回,这也可以让你做一些验证。

所以你定义一个模型:

public class MyViewModel
{
    [Required]
    [StringLength(50)]
    [Display(Name = "Username")]
    public string Username { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name = "Password")]
    public string Passsword { get; set; }
} 

所以你的标记变成了:

@model MyViewModel
@using(Html.BeginForm())
{
    <div>
        <span>@Html.LabelFor(m => m.Username)</span>
        <span>@Html.TexboxFor(m => m.Username)</span>
        Html.ValidationMessageFor(x => x.Username)
    </div>
    <div>
         <span>@Html.LabelFor(m => m.Password)</span>
         <span>@Html.PasswordFor(m => m.Password)</span>
         Html.ValidationMessageFor(x => x.Password)
    </div>
}

你的控制器动作是:

public ActionResult LoginMethod(MyViewModel myViewModel)
{
    if (myViewModel.Username == "admin" && myViewModel.Password == "admin1")
    {
        return RedirectToAction("Home");
    }
    else return RedirectToAction("Login");
}

您可以通过设置name属性以匹配操作的参数或viewmodel的属性来使其工作,但使用viewmodel和helper更加健壮,更容易重构,再加上验证。

答案 2 :(得分:0)

首先,你应该把输入放在像

这样的形式中
<% Html.BeginForm("LoginMethod", "Authentication");%>
  Username: <input type="text" id="username" name="username"  />
  Password: <input type="password" id="password" name="password"  />
  <input type="submit" id="Go" value="Post" />
<% Html.EndForm();%>

或者您可以使用<%: Html.TextBoxFor(m => m.UserName) %>代替html输入。

这里是您的Controller方法;

public ActionResult LoginMethod(string username,string password)
{ 
   **do your stuff!
}