【问题标题】:MVC3, Get updated form data from a listMVC3,从列表中获取更新的表单数据
【发布时间】:2011-03-03 20:54:49
【问题描述】:

我有一个强类型视图,模型中有一个自定义对象列表。

在视图中,我为列表中的每个对象显示文本框:

@using (Html.BeginForm("SaveData", "Localization", FormMethod.Post))
{
        foreach (YB.LocalizationGlobalText m in Model.GlobalTexts)
    { 
            @Html.Label(m.LocalizationGlobal.Name)
            @Html.TextBoxFor(model => m.Text)
            <br />
    }   
    <input type="submit" value="Save" />
}

现在我将如何从模型中的文本框中获取更新的数据。 我可以在 formcollection 中看到更新的数据:

    [HttpPost]
    public virtual ActionResult SaveData(FormCollection form)
    {
        // Get movie to update
        return View();
   }

form["m.Text"] = "testnewdata1,testnewdata"

但是我如何将它映射到模型,所以我有每个对象的更新值。 或者我怎样才能从formcollection中干净地得到它,像这样.. form[someid]["m.Text"]

编辑:

我也尝试过将模型作为参数传递,但模型数据为空。

[HttpPost]
        public virtual ActionResult SaveData(LocalizationModel model, FormCollection form)
        {
            // Get movie to update
            return View();
       }

当我查看模型时:model.GlobalTexts = null

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3


    【解决方案1】:
    [HttpPost]
    public virtual ActionResult SaveData(int movieId, FormCollection form)
    {
        // Get movie to update
        Movie movie = db.Movies.Where(x => x.Id == movieId);
        // Update movie object with values from form collection.
        TryUpdateModel(movie, form);
        // Do model validation
        if (!ModelState.IsValid)
            return View();
        return View("success");
    }
    

    编辑查看我不久前提出的这个问题:How to use multiple form elements in ASP.NET MVC

    假设您有这样的视图:

    @model IEnumerable<CustomObject>
    
    @foreach (CustomObject customObject in Model)
    {
        <div>
            @Html.TextBox(customObject.CustomProperty);
            <!-- etc etc etc -->
        </div>
    }
    

    像这样重构它:

    @model IEnumerable<CustomObject>
    
        @for (int count = 0; count < Model.Count(); count++)
        {
            <div>
                <!-- Add a place for the id to be stored. -->
                @Html.HiddenFor(x => x[count].Id);
    
                @Html.TextBoxFor(x => x[count].CustomProperty);
                <!-- etc etc etc -->
            </div>
        }
    

    现在在您的操作方法中执行以下操作:

    public virtual ActionResult SaveData(IEnumerable<CustomObject>)
    {
        // You now have a list of custom objects with their IDs intact.
    }
    

    如果您使用编辑器,那就更容易了,但我会让您自己弄清楚,因为它们非常简单。我链接的问题中接受的答案显示了一个示例。

    注意:如果需要,您可以将 IList 替换为 IEnumerable。

    【讨论】:

    • 我将如何获得 id ?我正在尝试保存每个对象,而不仅仅是一个。
    • 我会更新编辑。开洞。我忘了你在处理一个对象列表。
    • 快速尝试实现编辑器例如从链接,视图填充但再次保存时数据为空。我明天继续,可能忽略了一些明显的东西..
    • 我现在使用组合使其工作,但我仍然觉得奇怪的是,在我的操作中我需要传递一个 IEnumerable 才能工作。如果我通过模型,所有值都是空的。事件虽然我的视图是强类型的模型,而不是列表。
    • 您不必传递 IEnumerable,您可以添加 CustomObject 的 IEnumerable 或 IList 作为视图模型的属性,然后将视图模型传递给视图。请参阅我链接的问题作为示例,因为我的页面使用模型 Invite 并且我要为其创建编辑器的模型类型为 GuestInvite 有属性 Guests 这是一个 IEnumerable&lt;Guest&gt;
    【解决方案2】:

    如果我正确理解您的问题,您可以简单地将您的视图模型用作 SaveData 的参数,它会自动映射它:

    [HttpPost]
    public virtual ActionResult SaveData(ViewModelType viewmodel)
    {
        // Get movie to update
        return View();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多