使用 Razor、ASP.NET MVC 3 和 .NET 4.0 主从创建视图

2024-04-17

我是 .NET 的新手,如果我有任何愚蠢的错误,请耐心等待。

我正在使用 ASP.NET MVC 3 和 .NET 4.0

我想要一个"Create"具有子模型的模型的视图。该视图应包含子模型的partial "Create"视图,我将使用以下简单示例进行说明:

  • The Person model

    class Person
    {
        public string Name { get; set; }
        public Address { get; set; }
    }
    
  • The Address model

    class Address
    {
        public string City { get; set; }
        public string Zip { get; set; }
    
        //A List for creating a <select/> item in the view
        //containing cities fetched from the database.
        //The initialization is done in the controller action returning
        //the related partial view.
        public IEnumerable<SelectListItem> CityDropDown { get; set; } )
    }
    
  • 控制器动作

        class MyController : Controller
        {
            public ViewResult Create()
            {
                var person = new Person();
                var address = new Address();
                // initialization of address.CityDropDown omitted
                person.Address = address;
                return View(MyViews.CreatePersonView, person);
            }
    
            [HttpPost]
            public ViewResult Create(Person person)
            {
                //persistance logic
            }
        }
    
  • 我想要的视图层次结构:

为了实现这一目标,我尝试过的解决方案如下:

第一种方法:使用@Html.Partial(..) or @{Html.RenderPartial(..)}


我做了什么 :

  • The Person view

    @model Person
    @using(Html.BeginForm()){
        @Html.EditorFor(m=>m.Name)
        @Html.Partial(MyViews.AddressPartialView, @Model.Address)
    }
    
  • The Address局部视图

    @model Address
    @Html.EditorFor(m=>m.Zip)
    @Html.DropDownListFor(m=>m.City, @Model.CityDropDown)
    

问题 :

提交表格时,person.Address一片空白。在 Google 上进行了一些搜索后,我发现为了使地址字段的提交正常工作,生成的 HTML 标记必须如下(注意Address_字首) :

<form...>
    <input type=text id="Name" />
    <input type=text id="Address_Zip" />
    <select id="Address_City">
        <!-- options... -->
    </select>
</form>

不用说,在我的例子中生成的 HTML 标记并不相同,而是如下所示(Address_缺少前缀):

<form...>
    <input type=text id="Name" />
    <input type=text id="Zip" />
    <select id="City">
        <!-- options... -->
    </select>
</form>

第二种方法:使用编辑器模板对于地址模型


我做了什么 :

  • 我移动了Address文件夹的部分视图查看/共享/编辑器模板确保它与Address财产在Person模型,即地址.cshtml.

  • The Person view

    @model Person
    @using(Html.BeginForm()){
        @Html.EditorFor(m=>m.Name)
        @Html.EditorFor(@Model.Address) //will automatically find the Address 
                                 //partial view in the EditorTemplates folder
    }
    

问题 :

使用这种方法生成的标记实际上具有正确的前缀(即Address_),但我得到一个对象引用未设置到实例异常为了Address.CityDropDown属性告诉我控制器操作中预初始化的 Address 对象由于某种原因没有传递到部分视图。

第三种方法:将所有 Address 字段放入 Person 模型中


这种方法没有任何问题,但我不想使用它,因为如果我想在另一个模型中创建地址视图,我不想有多余的代码。

总结


我应该做什么才能拥有reusable我可以在我的应用程序中使用部分创建视图吗?


您使用 EditorTemplates 的方法是正确的,但请记住,您需要填充CityDropDown。因此,视图应该像这样传递:

Person model = new Person()
{
    Address = new Address
    {
        CityDropDown = new SelectListItem[]{
            new SelectListItem { Selected = true, Text = "Select one..." },
            new SelectListItem { Text = "Anywhere", Value = "Anywhere" },
            new SelectListItem { Text = "Somewhere", Value = "Somewhere" },
            new SelectListItem { Text = "Nowhere", Value = "Nowhere" }
        }
    }
};

这将使该视图仅包含:

@Html.EditorForModel()

然后你的EditorTemplates会从那里接:

〜/Views/shared/EditorTemplates/Address.cshtml(注:这是基于type不是属性名称)

@model MvcApplication.Models.Address
@Html.DropDownListFor(x => x.City, Model.CityDropDown)
@Html.EditorFor(x => x.Zip)

〜/Views/Shared/EditorTemplates/Person.cshtml

@model MvcApplication.Models.Person
@using (Html.BeginForm())
{ 
    @Html.EditorFor(x => x.Name)
    @Html.EditorFor(x => x.Address)
    <input type="submit" value="Save" />
}

三个视图然后呈现如下内容:

<form action="/" method="post">
  <input class="text-box single-line" id="Name" name="Name" type="text" value="" />
  <select id="Address_City" name="Address.City">
    <option selected="selected">Select one...</option>
    <option value="Anywhere">Anywhere</option>
    <option value="Somewhere">Somewhere</option>
    <option value="Nowhere">Nowhere</option>
  </select>
  <input class="text-box single-line" id="Address_Zip" name="Address.Zip" type="text" value="" />
  <input type="submit" value="Save" />

示例项目可以在这里找到:https://github.com/bchristie/StackOverflow-Examples/tree/master/questions-19247958 https://github.com/bchristie/StackOverflow-Examples/tree/master/questions-19247958

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Razor、ASP.NET MVC 3 和 .NET 4.0 主从创建视图 的相关文章

  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 从 Orchard 内的主题渲染图像

    我刚刚选择 Orchard 来构建我的博客 作为创建这个新博客的努力的一部分 我正在创建一个自定义主题 这个自定义主题同时具有 CSS 和图像 我的问题 我的问题基本上可以归结为 如何渲染属于主题一部分的图像 到目前为止我已经尝试过的 我尝
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • 通过API服务端点消费来自Kafka主题的消息

    目前 我有一个 API 服务端点 用 netcore6 C 编写 它将接受消息对象并将其保存到数据库 然后将该消息发布到 kafka topic 2 如何利用我的 API 服务端点始终监听 观看并连接到 kafka topic 1 一旦新消
  • 为什么`从. importviews`可以解决Flask中的循环导入吗? [复制]

    这个问题在这里已经有答案了 我从中学习更大的应用 http flask pocoo org docs 0 10 patterns packages 在这个文档中 它说 所有视图函数 顶部带有route 装饰器的函数 都必须导入到init p
  • NAudio - 更改缓冲麦克风音频的音高并发送到虚拟音频线

    我决定尝试使用 NAudio 和虚拟音频线创建一个与 Discord 或类似软件 一起使用的音板 我能够将音频从麦克风 注入 到音频电缆 这样我就可以通过选择虚拟音频电缆作为 Discord 中的输入设备来播放声音文件和麦克风音频到 Dis
  • 在类中初始化 static struct tm

    我想使用 tm 结构作为类中的静态变量 花了一整天的时间阅读和尝试 但它仍然无法工作 如果有人能指出我做错了什么 我将不胜感激 在我的课堂上 在公共下 我将其声明为 static struct tm dataTime 在main cpp中
  • ObservableCollection CollectionChanged 事件

    我有一个可观察的集合 并且在其上连接了一个 collectionChanged 事件 我将其项目绑定到用户界面中的列表框 当用户从列表框中删除 UI 中的某些项目时 CollectioChanged 会正确触发 但是 我需要知道已删除项目的
  • Android:使用 Admob 的 Consent SDK 获取用户位置

    我对 AdMob 的新功能有疑问 同意 SDK https developers google com admob android eu consent consent sdk the 整合指南 https developers googl
  • 相机框架相对于基准点的世界坐标

    我正在尝试确定世界坐标中的相机位置 相对于基于场景中找到的基准标记的基准位置 我确定 viewMatrix 的方法如下所述 确定相机姿势 https stackoverflow com questions 28335954 determin
  • 如何配置 Magento Enterprise 使用 Solr 作为主要搜索引擎?

    我尝试寻找文档 但它非常稀疏 我编写了以下指南 希望它可以帮助人们节省 2 3 个小时的安装 设置和配置时间 与 MySQL 全文搜索标准设置相比 使用 Solr 带来的性能提升非常惊人 在您的 Magento 安装中让它工作绝对值得花时间
  • 如何使用终端/cmd编译java项目

    我厌倦了使用 Eclipse 因为它太 简单 和 老式 所以我转向了一个名为 Sublime Text 3 的程序 并使用了一个名为 material theme 的包 这使得该程序看起来平坦且一切都很好 但我想用它来编写 Java 代码
  • 当我降级到 1.7 后执行 java -version 时,我仍然看到 Java 1.8

    我从 1 8 降级了 java 1 7 但降级时仍然看到 1 8java version 我改变了path并且还做了JAVA HOME1 7 更改为 JAVA HOME C Program Files x86 Java jdk1 7 0 7
  • 在 Sproutcore 2 中编写自定义控件

    我对 Sproutcore 相当陌生 但对 Handlebars 很熟悉 我已经浏览了 Todo 教程并查看了其他一些示例 我喜欢它的一切 并且想在 Backbone 上使用它 但我很难理解如何连接自定义控件 我可以看到一些数据将在绑定中发
  • 使用 BeanUtils 检索字段值

    我想提取未由某些自定义注释标记的私有字段值 这可以通过 BeanUtils 实现吗 如果是 怎么办 是的 假设您知道字段名称 您可以使用PropertyUtils getSimpleProperty http commons apache
  • “git stash”是否在内部“提交”到我的本地存储库?

    我以前只手动commit之前到我的本地仓库pushing 到远程仓库 但更多时候我pull获取我的编码伙伴的更改 有时我们都处理同一个文件并且存在冲突 在这些情况下 他告诉我要做一个git stash在我之前git pull然后一个git
  • 如何在没有 root 权限的情况下安装 python 3.x 和 2.y

    我正在一台没有root权限的共享机器上工作 但安装了Python 2 y 但我想要两种风格的Python 而且我想调用Python 2 y 只需键入 python 像往常一样 并为调用 Python 3 x 输入 python3 我知道这是
  • 如何使mat-select始终在angular2中的表单字段下打开?

    我需要角度材料垫选择组件在其表单字段的正下方打开 但它会打开所选选项位置上的下拉菜单 并且容器会根据所选选项稍微移动到顶部 有没有办法打开表单字段正下方的下拉容器 该行为是由 Material Design 规定的 您可以使用以下命令关闭所
  • 针对特定 EF Core 查询优化未知

    我有一个使用 EF Core 3 1 在 NET Framework 上运行的 webjob 项目 Webjob 处理来自 Azure 服务总线的消息并将其保存到 Azure SQL 数据库中 我遇到的问题是 Azure SQL 数据库为
  • Python psycopg2 不是 utf-8

    我使用 Python 连接到我的 postgresql 数据库 如下所示 conn psycopg2 connect database fedour user fedpur password host 127 0 0 1 port 5432
  • 无法从 D 中的 std.range 中切片 Take!R?

    我正在尝试使用切片运算符从 std range 获取 take 函数的返回值的切片 我的代码 auto tempChunk a b c d auto a tempChunk take 3 writeln a 0 2 由于本例中的 Take
  • 按后缀组合列表元素

    给定两个带后缀的列表 l1 C 1 B 1 A l2 B 2 C 2 D 我想像这样组合它们 C 1 C 2 B 1 B 2 A D 元素将与l1作为锚 这意味着 如果C 出现在之前B in l1 相同的顺序将保留在输出中 此外 具有相同前
  • 使用 Razor、ASP.NET MVC 3 和 .NET 4.0 主从创建视图

    我是 NET 的新手 如果我有任何愚蠢的错误 请耐心等待 我正在使用 ASP NET MVC 3 和 NET 4 0 我想要一个 Create 具有子模型的模型的视图 该视图应包含子模型的partial Create 视图 我将使用以下简单