加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC Gotcha?失意

发布时间:2020-12-16 06:30:25 所属栏目:asp.Net 来源:网络整理
导读:我有一个ASP.NET MVC html助手问题,如TextBoxFor(),HiddenFor()等.如果我有一个模型,如Employee,字符串成员名称和执行 Html.TextBoxFor(p = p.Name),假设ASP.NET MVC将始终使用Employee名称中的值,这是错误的吗?因为它没有. ASP.NET将覆盖该绑定并使用POST
我有一个ASP.NET MVC html助手问题,如TextBoxFor(),HiddenFor()等.如果我有一个模型,如Employee,字符串成员名称和执行 Html.TextBoxFor(p => p.Name),假设ASP.NET MVC将始终使用Employee名称中的值,这是错误的吗?因为它没有. ASP.NET将覆盖该绑定并使用POST中的内容.

例如,让我说我有以下代码:

模型

namespace MvcApplication2.Models
{
    public class Company
    {
        public string Name { set; get; }
        public List<Employee> Employees { set; get; }
    }

    public class Employee
    {
        public string Name { set; get; }
    }
}

调节器

namespace MvcApplication2.Controllers
{
    public class HomeController : Controller
    {
         public ActionResult Company(string Name)
        {
            return View(new Company { 
                Name = Name,Employees = new List<Employee> { 
                    new Employee { Name = "Ralph" },new Employee { Name = "Joe" } } 
            });
        }
    }
}

首页/ Company.cshtml

@using MvcApplication2.Models;
@model Company


<h2>Company's Name: @Model.Name</h2>
@foreach (Employee emp in Model.Employees)
{

    Html.RenderPartial("Employee",emp);
}

首页/ Employee.cshtml

@model MvcApplication2.Models.Employee
<b>Employee's Name: </b> @Html.TextBoxFor(p => p.Name);

当我点击相对网址“Home / Company?Name = MSFT”时,我希望Employee.cshtml在文本框中呈现“Ralph”和“Joe”,但它会为两个文本框呈现MSFT.我需要做什么才能让“拉尔夫”和“乔”出现在文本框中?我是否必须确保我的POST和GET变量在我的视图模型的所有层中都不会发生冲突(在本例中是公司和员工类)?这看起来很傻.必须有一个简单的解决方法,对吧?

这是结果的屏幕截图:

解决方法

HtmlHelper方法和ModelState

使用MVC HtmlHelper方法需要了解的重要事项:
他们总是首先看ModelState,值第二,ViewData第三.

ModelState很重要,因为它包含用户提交的值.如果页面验证失败,则ModelState用于存储先前的值和错误消息.

如果你想POST一个表单,如果一切都有效,你想再次显示表单,你要么必须:

>从POST重定向到GET(遵循PRG模式)
>清除ModelState:ModelState.Clear();

EditorFor vs RenderPartial

另一个重要的事情是EditorFor / DisplayFor与RenderPartial之间的区别.

当你对一个项目使用EditorFor / DisplayFor(例如.EditorFor(m => m.Person))时,它会在“Person”模板中添加一个“命名空间”,这样子控件就会有一个独特的名字.例如,在模板中,.TextBoxFor(p => p.Name)将呈现类似< input name =“Person.Name”.... 但是,使用RenderPartial时,不会创建此类命名空间.因此,.TextBoxFor(p => p.Name)将呈现< input name =“Name”...,如果您有多个编辑器,则不会是唯一的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读