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

4

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

<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");
    }
}

2
您的输入需要与属性名称匹配的“name”属性。但是,您应该使用模型并使用强类型的HTML助手来绑定到您的模型,并将模型发送回服务器。请访问MVC网站并学习基础知识。 - user3559349
3个回答

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");
  }
}

感谢您的帮助,帮助我解决了我的问题 :) - user3423878
@user3423878 没问题。 :) - hutchonoid

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和helpers更加健壮且易于重构,还可以进行验证。

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输入。

这里是您的控制器方法;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接