【问题标题】:c# asp.net: add element to a list in a model using formc# asp.net:使用表单将元素添加到模型中的列表
【发布时间】:2019-07-12 08:26:43
【问题描述】:

我为我非常糟糕的术语道歉,

但我会尝试更好地解释自己:

  1. 给出一个包含 obj 列表和一个 obj 的模型

  2. 我希望在我的视图中有一个表单将 obj(和列表)发送到控制器

  3. 控制器将 obj 添加到更新列表并将其发送回视图。

    我的问题是将“初始”列表传递给提交时的表单;

这不起作用:

 <div class="form-group">
  @Html.HiddenFor(m => m.RequestList, Model.RequestList)
</div>

编辑:回答...

这个问题在这里可能已经有了答案:

型号 Model Binding to a List MVC 4 3 个答案

不,不是, 我不是要编辑列表,而不仅仅是“声明”, 无论如何,正如建议的那样,我正在尝试循环列表中的元素并“将其添加到新元素中”;

  • 有些东西实际上被传递给了模型,但是是空的!

                        for (int i = 0; i < Model.RequestList.Count(); ++i)
                    {
                        @Html.HiddenFor(m => m.RequestList[i], new {
                            StartTime = Model.RequestList[i].StartTime,
                            EndTime = Model.RequestList[i].EndTime,
                            StatusId = Model.RequestList[i].StatusId,
                        })
                    }
    

    再次:我做错了什么?

    • 我认为this solution 实际上更接近我的意思(抱歉不是stackoverflow)

但是尝试这样的事情

@using (Html.BeginForm("CreateComplex",  null, FormMethod.Post, new { @class = "",  RequestList = Model.RequestList}))

还是不行

【问题讨论】:

  • 简而言之,您将需要一个for 循环,然后为要绑定的列表项的每个属性呈现隐藏的输入。也许将新项目添加到数据库中的列表中,然后从后端重新加载整个列表而不是使用 POST 往返它会更容易?这样,您只需要 POST 必须添加的新项目的 ID。
  • 更新了主帖,有些东西通过了,但它是空的,可能我做错了;出于好奇,由于我的目标不是修改视图中的列表,有没有办法将其“传递”给新模型而无需循环?
  • 关于要发布的null:您的代码应该是for (int i = 0; i &lt; Model.RequestList.Count(); ++i) { @Html.HiddenFor(m =&gt; m.RequestList[i].StartTime) @Html.HiddenFor(m =&gt; m.RequestList[i].EndTime) @Html.HiddenFor(m =&gt; m.RequestList[i].StatusId) },即您要发布的模型的每个属性都有一个@Html.HiddenFor

标签: c# asp.net forms razor


【解决方案1】:

如果您不想编辑列表,而只是向其中添加一个新项目,您可以尝试以下流程:

  • 从数据库加载整个当前列表并显示它的 GET“列表”操作。这将是要显示的初始页面。
  • 有一个 GET "AddToList" 操作,它使用&lt;form&gt; 和将单个项目添加到列表所需的所有输入来呈现(部分)视图。可以从主页调用此操作(例如使用Html.RenderAction),并在主页或对话框中呈现。通过将此“创建”用例与“显示列表”用例分开,您将提高可重用性和可维护性。
  • POST "AddToList" 操作只是将单个项目添加到数据库中的列表中,然后重定向到 GET "List" 操作以显示更新的结果。

使用此流程,无需发布所有已存在的列表项,如果需要显示它们,始终可以从后端/数据库加载。优点是您还将看到其他用户或进程同时添加的任何项目。这还应该处理所需的任何排序(新项目自然会出现在正确的位置)。

【讨论】:

    【解决方案2】:

    如果您不想使用数据库路由,可以使用ViewBag 存储列表,然后使用System.Web.HelpersJson 处理转换示例

    为了你需要的视图

    @{
        var RequestList = (List<string>)ViewBag.RequestList;
    }
    
    //you are using a null controller here --gotten from question
    @using (Html.BeginForm("CreateComplex", null, FormMethod.Post, new { @class = "" }))
    {
         <input type="hidden" name="RequestList" id="myHiddenInput" value="@Json.Encode(RequestList)" />       
         //other inputs that are binded to the model
    }
    

    控制器

    [HttpPost]
    public ActionResult CreateComplex(Model model, string RequestList)
    {
        var thelist = System.Web.Helpers.Json.Decode<List<string>>(RequestList);
        thelist.Add(model.TheAttrForAddition);
        //model.TheAttrForAddition is the attribute in the model the user is editing
    
        ViewBag.RequestList= thelist;
        //do other things and return the view
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2014-06-16
      相关资源
      最近更新 更多