C# 在MVC中编辑列表集合中属性的方法

C# 在MVC中编辑列表集合中属性的方法,c#,asp.net-mvc,C#,Asp.net Mvc,这是我的模型,我通过excel导入得到这个列表,我要求用户验证数据 因此,对于每个许可方,用户都应该选择一个操作[actionId],并且还有一个基于用户选择的操作[ReferenceId]的引用 因此,为了选择ActionId和ReferenceId,我使用了一个模式弹出窗口,允许用户选择action和ReferenceId[决定这两个参数的过程很复杂,但包括大量条件检查和并行输入选择, 示例:首先决定许可人是新的还是现有的。如果决定是现有的,请查找现有id、相关地址。然后决定使用新地址或替换

这是我的模型,我通过excel导入得到这个列表,我要求用户验证数据

因此,对于每个许可方,用户都应该选择一个操作[actionId],并且还有一个基于用户选择的操作[ReferenceId]的引用
因此,为了选择ActionId和ReferenceId,我使用了一个模式弹出窗口,允许用户选择action和ReferenceId[决定这两个参数的过程很复杂,但包括大量条件检查和并行输入选择, 示例:首先决定许可人是新的还是现有的。如果决定是现有的,请查找现有id、相关地址。然后决定使用新地址或替换现有地址。如果决定替换现有地址,请选择要替换的地址

这就是为什么计划将其逻辑保留为一个单独的逻辑,并仅返回结果ie 2 ID actionid和referenceID]

提交时如何设置这两个属性的值 我的观点我是这样计划的

    public class VerifyLicensorModel
    {
        public int TempId { get; set; } 
        public string Licensor { get; set; } 
        public string Address { get; set; }
        public int LicensorId { get; set; }
        public int ActionId { get; set; }   
        public int ReferenceId { get; set; }
    }
@model-IList
@使用(Html.BeginForm())
{
@Html.ValidationSummary(true)
许可人
地址
行动
验证
@对于(int i=0;iModel[i].TempId)
@Html.HiddenFor(modeleItem=>Model[i].LicensorId)
@DisplayFor(modelItem=>Model[i]
@Html.TextAreaFor(modelItem=>Model[i].地址)
@Html.HiddenFor(modeleItem=>Model[i].ActionId)
@Html.HiddenFor(modeleItem=>Model[i].ReferenceId)
验证//onclick plannig以显示弹出窗口
}
@ActionLink(“取消”、“许可证导入”、“导入”、新建{@id=@ViewBag.EditionId}、新建{@class=“btn btn link”})
}
那么我的方法正确吗?如果是,如何设置“选定行”属性?
或者有没有更好的方法或示例来建议实现相同的功能?

通常,视图模型应该是页面和页面上元素的表示。如果要在模态上使用此模板,则可以使用局部视图模板

您需要创建列表的新属性,以表示ActionID和ReferenceID可用的选项,并作为参数传递,以便在视图中的helper函数@Html.DropDownListFor中使用

        @model  IList<ApplicationLab.Models.VerifyLicensorModel>
        @using (Html.BeginForm())
        {
            @Html.ValidationSummary(true)

            <table class="table">
                <tr>
                    <th>
                      Licensor
                    </th>
                    <th>
                     Address
                    </th>
                    <th>
                        Action
                    </th>
                    <th>
                        Verify
                    </th>
                </tr>
              @for (int i = 0; i < Model.Count(); i++) 
              {
                    <tr>
                        <td>
                            @Html.HiddenFor(modelItem => Model[i].TempId)
                            @Html.HiddenFor(modelItem => Model[i].LicensorId)
                            @Html.DisplayFor(modelItem => Model[i].Licensor)                                
                        </td>
                        <td>
                            @Html.TextAreaFor(modelItem => Model[i].Address)
                        </td>
                        <td>                                  
                            @Html.HiddenFor(modelItem => Model[i].ActionId)
                            @Html.HiddenFor(modelItem => Model[i].ReferenceId)                             
                        </td>
                        <td>
                            <a >Verify</a> // onclick plannig to show popup
                        </td>
                    </tr>
                }
            </table>

            <div class="form-group">
                <div class="col-md-10" style="text-align:center;">
                    <input type="submit" value="Submit" class="btn btn-primary" />
                    @Html.ActionLink("Cancel", "LicenseImport", "Import", new { @id = @ViewBag.EditionId }, new { @class = "btn btn-link" })
                </div>
            </div>
        }

不相关,但请不要使用
@Html.HiddenFor(modeleItem=>Model[i].TempId)
-(大写M)-在某些情况下可能会导致错误-使用
@Html.HiddenFor(M=>M[i].TempId)
为什么不只是对这些属性使用下拉列表而不是弹出窗口来进行更改?决定这两个参数的过程有点复杂,包括大量条件检查和并行选择输入,这就是为什么计划将其逻辑保留为单独的逻辑,并仅返回结果,即2个ID actionid和referenceID。示例:首先确定许可人是新的还是现有的。如果决策存在,则查找现有id、相关地址。然后决定使用新地址或替换现有地址。如果决定替换现有的,请选择要替换的一个。在不查看弹出窗口是什么以及如何调用它的情况下,不可能给出答案,但在函数调用中,
$(this)
将是
标记,您可以使用
$(this)获取相关的隐藏输入。最近('td')。prev('td')。children('input')
然后使用
.eq(0)
eq(1)
OK访问它们,这意味着我必须使用Jquery通过JS设置隐藏字段。但是有没有像BeginCollection[显然不能在这里使用]这样的解决方案可以处理这种情况呢?它实际上不是两个相关的下拉列表。示例:首先确定许可证是新的还是现有的。如果决策存在,则查找现有id[第一个下拉列表]、相关地址。然后决定使用新地址或替换现有地址。如果决定替换现有的,请选择要替换的[第二个下拉列表]。因此,决定是/否对构建下拉列表或填充模型有一定影响
public class VerifyLicensorModel
{
    public int TempId { get; set; } 
    public string Licensor { get; set; } 
    public string Address { get; set; }
    public int LicensorId { get; set; }
    public int ActionId { get; set; }
    public List<SelectListItem> ActionOptions { get; set; }   
    public int ReferenceId { get; set; }
    public List<SelectListItem> ReferenceOptions { get; set; }   
}
@Html.DropDownListFor(m => m.ActionId, Model.ActionOptions);
@Html.DropDownListFor(m => m.ReferenceId, Model.ReferenceOptions);