ASP.NET MVC-添加到视图模型列表并提交

如何解决ASP.NET MVC-添加到视图模型列表并提交

我有一个带有订单/ odc请求表单的ASP.NET MVC程序。我有一个客户,订单和订单项模型。我想做的是允许用户下订单以批准项目列表。我将viewmodel传递给包含几个字段(包括订单项对象列表)的表单/视图。我能够向显示订单项列表的表中动态添加行,但是在提交时,viewmodel列表中没有任何内容。我究竟做错了什么?如何将输入表中的项目传递到视图,以便可以提交到数据库?

控制器

    public ActionResult NewOdc()
    {
        var viewModel = new NewOdcViewModel()
        {
            OdcItems = new List<tblOdcItem>() 
        };

        viewModel.OdcItems.Add(new tblOdcItem());

        return View(viewModel);
    }

我从jQuery调用此代码以将新项目添加到列表中:

    public ActionResult GetView(string rowCount)
    {
        tblOdcItem item = new tblOdcItem();
        return PartialView("_OdcItemEditor",item);
    }

提交后,我将此代码称为:

    [HttpPost]
    public ActionResult NewOdcSubmit(NewOdcViewModel viewModel)
    {
        _context.tblOdcs.Add(new tblOdc());
        ...

我正在使用foreach浏览列表并为每个项目创建一个局部。

查看:

@using (Html.BeginForm("NewOdcSubmit","Odc",FormMethod.Post))
{
            if (Model != null)
            {
                @Html.HiddenFor(m => m.OdcItems);
            }

            <div class="panel panel-info">
                <div class="panel-heading">
                    <h2 class="panel-title">Enter New ODC</h2>
                </div>
                <div class="panel-body">
                    @Html.AntiForgeryToken()
                    <div class="form-group">
                        @Html.LabelFor(model => model.User.UserName,new { @class = "col-md-2 col-sm-1 control-label" })
                        <div class="col-md-2 col-sm-3">
                            @Html.TextBoxFor(model => model.User.UserName,new { @Value = ((PM_Portal2020.Models.tblUser)Session["User"]).UserName,@readonly = true })
                        </div>
                        @Html.LabelFor(model => model.User.Phone,new { @class = "col-md-2 col-sm-1 control-label" })
                        <div class="col-md-2 col-sm-3">
                            @Html.TextBoxFor(model => model.User.Phone,new { @Value = ((PM_Portal2020.Models.tblUser)Session["User"]).Phone })
                        </div>
                    </div>
                    <div class="form-group col-md-10 col-sm-12">
                        <label>Expenses</label>
                        <table id="submissionTable" class="table table-bordered">
                            <thead>
                                <tr>
                                    <th>Qty</th>
                                    <th>Description</th>
                                    <th>Estimated Cost</th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach (PM_Portal2020.Models.tblOdcItem item in Model.OdcItems)
                                {
                                    @Html.Partial("_OdcItemEditor",item)
                                }
                            </tbody>
                        </table>
                        <p>
                            <button id="add" type="button" class="btn btn-primary">Add</button>
                        </p>
                    </div>
                    <div class="form-group col-lg-10 col-sm-12">
                        @Html.LabelFor(model => model.Details,new { @class = "col-md-2 col-sm-1 control-label" })
                        <div class="">
                            @Html.TextAreaFor(model => model.Details,new { @class = "form-control" })
                        </div>
                    </div>
                </div>
                <div class="panel-footer">
                    <div class="">
                        <button type="submit" class="btn btn-success">Save</button>&nbsp;&nbsp;
                        @Html.ActionLink("Back","Index")
                    </div>
                </div>
            </div>
}

Shared文件夹中的PartialView:

@model PM_Portal2020.Models.tblOdcItem

<tr @Html.Id("tablerow" + Model.ID)>
    <td>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Quantity,new { @class = "text-box single-line",name = "Quantity[" + Model.ID + "]",type = "text",value = "",required = "required" })
        </div>
    </td>
    <td>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Description,name = "Description[" + Model.ID + "]",required = "required",id = "itemDesc" })
        </div>
    </td>
    <td>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.EstimatedCost,name = "EstimatedCost[" + Model.ID + "]",required = "required" })
        </div>
    </td>
    <td>
        <button type="button" class="btn btn-primary" onclick="removeTr(this);">
            <span class="glyphicon glyphicon-trash"></span>
        </button>
    </td>
</tr>

查看模型

public class NewOdcViewModel
{
    public NewOdcViewModel()
    {
    }

    public IList<tblOdcItem> OdcItems { get; set; }
    public string Details { get; set; }
    public int OdcId { get; set; }
    public tblUser User { get; set; }
}

它提交给控制器,但是odcitems列表始终为count =0。任何帮助都将非常有用。谢谢

解决方法

这是一个JavaScript示例,只需在添加/删除操作中使用此功能即可重新排列名称。

function RearangeName(){
        var i = 0;
        $("#submissionTable>tbody>tr").each(function () {
            $(this).find("input").each(function () {
                if ($(this).prop("name").indexOf('Quantity') > 0) {
                    $(this).attr('name',"OdcItems[" + i + "].Quantity");
                }
                if ($(this).prop("name").indexOf('Description') > 0) {
                    $(this).attr('name',"OdcItems[" + i + "].Description");
                }
                if ($(this).prop("name").indexOf('EstimatedCost') > 0) {
                    $(this).attr('name',"OdcItems[" + i + "].EstimatedCost");
                }
            });
            i++;
        });
    }
,

该名称应与模型属性匹配,因此在部分视图中,您将名称设置为 OdcItems [0] .Quantity ,而不是Quantity [“ + Model.ID +”]。>

@Html.TextBoxFor(model => model.Quantity,new { @class = "text-box single-line",name = "OdcItems[0].Quantity",type = "text",value = "",required = "required" })

例如 OdcItems [0]。数量

OdcItems [1]。数量

OdcItems [2]。数量

....

OdcItems [n]。数量

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-