c#asp.net:使用表单将元素添加到模型的列表中

时间:2019-07-12 08:26:43

标签: c# asp.net forms razor

很抱歉我的术语很差

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

  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}))

仍然不起作用

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

如果您不想走数据库路线,可以使用ViewBag存储列表,然后使用Json中的System.Web.Helpers处理转换示例

您需要的视图

@{
    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
}