在 C# Web 应用程序中获取文本框的值时遇到问题,详情如下:
Facing Problems in Getting the values of textboxes in C# Web Application with details below:
我在从一个视图获取 Post Method
的值时遇到问题。
我已经尝试了所有方法,但仍然无法获取值。
这是我的代码:
EmpController
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text;
namespace My_Work.Controllers
{
public class EmpController : Controller
{
// GET: Emp
public ActionResult Index()
{
return View();
}
[HttpGet]
public ActionResult Emp()
{
return View();
}
[HttpPost]
public ActionResult Emp(string name,string design)
{
ViewBag.Name1 =name;
ViewBag.Design1 = design;
return View();
}
public ActionResult EmpDtl()
{
return View();
}
}
}
Emp
查看:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Employee Details</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
@using (Html.BeginForm("EmpDtl","Emp", FormMethod.Post))
{
<h2>Employee Details</h2>
<hr />
<table cellpadding="2" cellspacing="0" border="0">
<tr>
<td>Employee Name:</td>
<td>
@Html.TextBox("Name")
</td>
</tr>
<tr>
<td>Designation:</td>
<td>
@Html.TextBox("Design")
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
}
</body>
</html>
EmpDtl
查看:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Employee Details</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<h2>Employee Details</h2>
<br />
<br />
<span>Employee Name: </span>@ViewBag.Name1
<br />
<span>Designation: </span>@ViewBag.Design1
</body>
</html>
这是我无法在 Post 方法上获取文本框值的代码,我已经尝试了所有方法但找不到问题所在。任何帮助解决此问题将不胜感激。
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Employee Details</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<h2>Employee Details</h2>
<br />
<br />
<span>Employee Name: </span>@ViewBag.Name1
<br />
<span>Designation: </span>@ViewBag.Design1
</body>
</html>
- 不要使用
ViewBag
。它是无类型的,因此不安全。它应该只用于原型制作,imo。
- 您需要一个 ViewModel class(每个视图或逻辑页面都有单独的 classes),它代表渲染页面的内容 和 您要从传入的
POST
表单请求中绑定的数据。
- 不要 使用 Entity Framework 类型作为绑定的 ViewModel:虽然它看起来很方便(甚至一些 Microsoft 的旧教程也演示了这种反技术),但它引入了主要的安全问题,因为它允许用户为任意值任意指定值(例如
UserId
和Password
)。此外,它在实践中不起作用,因为网页的内容不映射 1:1 与单个数据库行或域实体:考虑“编辑用户" 页面:它将有两个密码输入(“新密码”和“确认密码”),这些属性将不存在于您的用户实体 class 上。
- 另外 ASP.NET MVC 对 Entity Framework 使用不同的数据注释,它们可能会发生冲突(例如
MaxLength
与 StringLength
)。
- 我注意到 ASP.NET MVC 设计的一个尴尬限制意味着如果您使用
HtmlHelper
生成表单输入,您不能在同一页面上有多个 <form>
元素。有很多方法可以解决这个问题,但我不会详细介绍,因为这与本次对话无关。
- 另一个恼人的限制是,如果你使用控制器操作方法参数绑定(而不是使用
UpdateModel
显式)你不能有不可变的视图模型类型:它们必须有一个默认的(无参数的)构造函数,即使那将视图模型对象置于无效状态。
无论如何,这就是您的视图模型的样子:
class EmployeeDetailsViewModel
{
[Display( Name = "Employee Name" )]
[Required]
public string Name { get; set; }
[Required]
public string Designation { get; set; }
}
更改您的 POST
操作的签名:
[HttpPost]
public ActionResult Emp( EmployeeDetailsViewModel model ) // IIRC the parameter must be named "model" in ASP.NET MVC, I might be wrong. It's been a while.
{
}
并更改您的 .cshtml
:
- 提示:使用
nameof()
以确保您拥有正确的操作名称。
- 很遗憾,您不能使用
nameof()
作为控制器名称,因为 Controller
class 名称后缀无法正确绑定。 (ASP.NET MVC 中的另一个小烦恼)
@model EmployeeDetailsViewModel
...
@using (Html.BeginForm( action: nameof(EmpController.EmpDtl), controller: "Emp", FormMethod.Post))
{
<h2>Employee Details</h2>
<hr />
<table cellpadding="2" cellspacing="0" border="0">
<tr>
<td>Employee Name:</td>
<td>
@Html.TextBoxFor( m => m.Name )
</td>
</tr>
<tr>
<td>Designation:</td>
<td>
@Html.TextBoxFor( m => m.Designation )
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
}
我在从一个视图获取 Post Method
的值时遇到问题。
我已经尝试了所有方法,但仍然无法获取值。
这是我的代码:
EmpController
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text;
namespace My_Work.Controllers
{
public class EmpController : Controller
{
// GET: Emp
public ActionResult Index()
{
return View();
}
[HttpGet]
public ActionResult Emp()
{
return View();
}
[HttpPost]
public ActionResult Emp(string name,string design)
{
ViewBag.Name1 =name;
ViewBag.Design1 = design;
return View();
}
public ActionResult EmpDtl()
{
return View();
}
}
}
Emp
查看:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Employee Details</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
@using (Html.BeginForm("EmpDtl","Emp", FormMethod.Post))
{
<h2>Employee Details</h2>
<hr />
<table cellpadding="2" cellspacing="0" border="0">
<tr>
<td>Employee Name:</td>
<td>
@Html.TextBox("Name")
</td>
</tr>
<tr>
<td>Designation:</td>
<td>
@Html.TextBox("Design")
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
}
</body>
</html>
EmpDtl
查看:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Employee Details</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<h2>Employee Details</h2>
<br />
<br />
<span>Employee Name: </span>@ViewBag.Name1
<br />
<span>Designation: </span>@ViewBag.Design1
</body>
</html>
这是我无法在 Post 方法上获取文本框值的代码,我已经尝试了所有方法但找不到问题所在。任何帮助解决此问题将不胜感激。
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Employee Details</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<h2>Employee Details</h2>
<br />
<br />
<span>Employee Name: </span>@ViewBag.Name1
<br />
<span>Designation: </span>@ViewBag.Design1
</body>
</html>
- 不要使用
ViewBag
。它是无类型的,因此不安全。它应该只用于原型制作,imo。 - 您需要一个 ViewModel class(每个视图或逻辑页面都有单独的 classes),它代表渲染页面的内容 和 您要从传入的
POST
表单请求中绑定的数据。- 不要 使用 Entity Framework 类型作为绑定的 ViewModel:虽然它看起来很方便(甚至一些 Microsoft 的旧教程也演示了这种反技术),但它引入了主要的安全问题,因为它允许用户为任意值任意指定值(例如
UserId
和Password
)。此外,它在实践中不起作用,因为网页的内容不映射 1:1 与单个数据库行或域实体:考虑“编辑用户" 页面:它将有两个密码输入(“新密码”和“确认密码”),这些属性将不存在于您的用户实体 class 上。- 另外 ASP.NET MVC 对 Entity Framework 使用不同的数据注释,它们可能会发生冲突(例如
MaxLength
与StringLength
)。
- 另外 ASP.NET MVC 对 Entity Framework 使用不同的数据注释,它们可能会发生冲突(例如
- 我注意到 ASP.NET MVC 设计的一个尴尬限制意味着如果您使用
HtmlHelper
生成表单输入,您不能在同一页面上有多个<form>
元素。有很多方法可以解决这个问题,但我不会详细介绍,因为这与本次对话无关。 - 另一个恼人的限制是,如果你使用控制器操作方法参数绑定(而不是使用
UpdateModel
显式)你不能有不可变的视图模型类型:它们必须有一个默认的(无参数的)构造函数,即使那将视图模型对象置于无效状态。
- 不要 使用 Entity Framework 类型作为绑定的 ViewModel:虽然它看起来很方便(甚至一些 Microsoft 的旧教程也演示了这种反技术),但它引入了主要的安全问题,因为它允许用户为任意值任意指定值(例如
无论如何,这就是您的视图模型的样子:
class EmployeeDetailsViewModel
{
[Display( Name = "Employee Name" )]
[Required]
public string Name { get; set; }
[Required]
public string Designation { get; set; }
}
更改您的 POST
操作的签名:
[HttpPost]
public ActionResult Emp( EmployeeDetailsViewModel model ) // IIRC the parameter must be named "model" in ASP.NET MVC, I might be wrong. It's been a while.
{
}
并更改您的 .cshtml
:
- 提示:使用
nameof()
以确保您拥有正确的操作名称。 - 很遗憾,您不能使用
nameof()
作为控制器名称,因为Controller
class 名称后缀无法正确绑定。 (ASP.NET MVC 中的另一个小烦恼)
@model EmployeeDetailsViewModel
...
@using (Html.BeginForm( action: nameof(EmpController.EmpDtl), controller: "Emp", FormMethod.Post))
{
<h2>Employee Details</h2>
<hr />
<table cellpadding="2" cellspacing="0" border="0">
<tr>
<td>Employee Name:</td>
<td>
@Html.TextBoxFor( m => m.Name )
</td>
</tr>
<tr>
<td>Designation:</td>
<td>
@Html.TextBoxFor( m => m.Designation )
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
}