在 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 的旧教程也演示了这种反技术),但它引入了主要的安全问题,因为它允许用户为任意值任意指定值(例如UserIdPassword)。此外,它在实践中不起作用,因为网页的内容不映射 1:1 与单个数据库行或域实体:考虑“编辑用户" 页面:它将有两个密码输入(“新密码”和“确认密码”),这些属性将不存在于您的用户实体 class 上。
      • 另外 ASP.NET MVC 对 Entity Framework 使用不同的数据注释,它们可能会发生冲突(例如 MaxLengthStringLength)。
    • 我注意到 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>
        }