C# 更改创建的帮助器方法的名称

C# 更改创建的帮助器方法的名称,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我正在用MVC制作一个表单,并且正在使用([expression])helper方法的[ControlType](例如Html.TextBoxFor(…)) 要将数据绑定到控件,我使用以下ViewModel: public class UserViewModel { //The Model that will be used to bind data to the elements public UserModel User { get; set; } //Used t

我正在用MVC制作一个表单,并且正在使用([expression])helper方法的
[ControlType](例如
Html.TextBoxFor(…)

要将数据绑定到控件,我使用以下ViewModel:

public class UserViewModel
{
    //The Model that will be used to bind data to the elements
    public UserModel User { get; set; }

    //Used to bind selectable options to DropDownLists
    public SelectList DescentTypes { get; set; }
    public SelectList GenderTypes { get; set; }
}
使用此选项时,控件的名称将设置为
name=“Property.subperty”
(例如
name=“User.Id”
),但我希望它在html表单上显示为
name=“Id”


不必编写大量自定义代码,框架就可以将其转换回ViewModel(UserViewModel)或模型(User)本身,这样做是否可行?

我建议保留默认命名,除非您有很好的理由修改它。ID(您的问题似乎倾向于此)更灵活

更改ID ID不是与表单一起提交的,因此您可以根据需要设置它们,而不破坏模型绑定。默认情况下,它们是分层的,但您可以内联覆盖它们:

@Html.TextBoxFor( o => o.UserName, new { id = "foo" } )
当然,这是体力劳动

如果最大的问题是外部JS/CSS,我建议在(CSS/jQuery/whatever)选择器中使用类名和
data-*
属性,而不是id

@Html.TextBoxFor( o => o.User.UserName, new { data_role="grand-total" } )
它仍然是手动的,但它是描述性的,独立于ID

有时,我在视图中使用一段脚本来初始化一个更大的JS类,其中包含最容易直接在视图中获得的数据。这允许脚本的大部分驻留在外部文件中,同时允许使用动态值对其进行初始化。这不仅仅适用于ID

更改生成的标记和绑定 作为参考,假设您想更改ID和名称

  • 编写自己的
    HtmlHelper
    扩展方法来创建所需的标记。您可能会包装不接受表达式的现有方法,并将显式值传递给它们,以指示所需的名称
  • 编写自己的
    ModelBinder
    来映射原始表单集合
  • 确定处理分层对象的策略(这是命名约定首先存在的主要原因)
  • 第#3项可以通过修饰属性来说明命名应该如何执行以及模型绑定应该如何映射来解决。这可能很快变得复杂

    public class UserViewModel
    {
        // use this metadata to determine how to handle properties on this member
        [Flatten]
        public UserModel User { get; set; }
    
        public SelectList DescentTypes { get; set; }
        public SelectList GenderTypes { get; set; }
    }
    
    选择
  • 通过直接向视图模型中添加
    用户的属性来展平视图模型。看起来您正在从域模型组成视图模型。这通常不是个好主意。我建议

  • 别管命名了。它真的不会伤害任何东西,它让生活变得轻松。通过使用helper方法,您可以避免在客户机代码中直接使用名称/ID

  • 例如:

    // JavaScript + Razor
    var name = "@Html.NameFor( o => o.User.Id )";
    alert(name);
    

    我可以问一下为什么命名为
    User.Id
    ?它之所以这样命名是因为可能会发生冲突。我认为这需要您编写一个自定义模型绑定器。尽管如此,我认为使用平面视图模型并通过任何类型的映射库将属性从模型映射到它们实际上会更容易…@neoistheone从html命名约定的角度来看,它感觉“脏”。我假设该名称在重新水合对象时用于反射目的。@PatrykĆwiek此发布的viewmodel将添加更多与其相关的对象。因此将有一个用户、角色等。。。(单个实体的主摘要)感谢您的帮助。
    用户
    更像一个DTO,因为它只有充实视图所需的属性。如果出于某种原因我想使用样式的Id或名称,javascript和css是如何工作的?我看到了js示例,但MVC是否编译了该示例,即使js文件位于外部文件中?1)在
    用户类型上有意义。2) 我重读了你的问题,听起来你更关心ID而不是名字,所以我更新了我的答案。3) 我添加了一些关于处理外部文件的信息。