如何在 ASP.NET MVC 中使用多个表单元素

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 中使用多个表单元素【英文标题】:How to use multiple form elements in ASP.NET MVC 【发布时间】:2011-07-01 12:30:43 【问题描述】:

所以我是 ASP.NET MVC 的新手,我想为集合中的每个项目创建一个带有文本框的视图。我该如何做到这一点,以及当它返回时如何捕获信息?我使用表单和表单元素为模型构建静态表单,但从未基于可变大小的集合动态生成表单元素。

我想在 mvc 3 中做这样的事情:

@foreach (Guest guest in Model.Guests)

    <div>
        First Name:<br />
        @html.TextBoxFor(???) @* I can't do x => x.FirstName here because
                                 the model is of custom type Invite, and the
                                 lambda wants to expose properties for that
                                 type, and not the Guest in the foreach loop. *@
    </div>

如何为每位客人创建一个文本框?以及如何在它发回的操作方法中捕获它们?

感谢您的帮助。

【问题讨论】:

你能告诉我们Guest类的样子吗?什么是 Model.Guests?列出 ? 来宾类由实体框架动态生成。只是上面有一些属性,例如 FirstName、LastName、Id、InviteId 等 【参考方案1】:

绝对是编辑器模板的工作。所以在你看来,你只写了一行:

@Html.EditorFor(x => x.Guests)

并在相应的编辑器模板内(~/Views/Shared/EditorTemplates/Guest.cshtml

@model AppName.Models.Guest
<div>
    First Name:<br />
    @Html.TextBoxFor(x => x.FirstName)
</div>

仅此而已。

现在以下操作将立即可用:

public ActionResult Index(int id)

    SomeViewModel model = ...
    return View(model);


[HttpPost]
public ActionResult Index(SomeViewModel model)

    if (!ModelState.IsValid)
    
        return View(model);
    
    // TODO: do something with the model your got from the view
    return RedirectToAction("Success");

请注意,编辑器模板的名称很重要。如果您的视图模型中的属性是:

public IEnumerable<Guest> Guests  get; set; 

编辑器模板应称为Guest.cshtml。它将为Guests 集合的每个元素自动调用,它会负责正确生成输入的 id 和名称,以便在您 POST 时自动执行所有操作。

结论:每次在 ASP.NET MVC 视图中编写循环(forforeach)时,您都应该知道自己做错了,并且有更好的方法。

【讨论】:

如果我想为不同的区域使用不同的编辑器怎么办?即,我希望在管理部分为 Guest 使用不同的编辑器,其选项比公共部分中的 Guest 编辑器更多。 没关系。 Html.EditorFor() 具有编辑器名称的重载。感谢您的帮助! @Chevex,然后在 Admin 部分提供相应的编辑器模板:~/Areas/Admin/Views/Shared/EditorTemplates/Guest.cshtml @Chevex,不,尽量避免这种过载。改用约定。它更好,并且大多数开发人员应该已经熟悉约定。 感谢您的帮助。我现在有一个不同的问题。也许你能帮忙?我在这里创建了另一个问题:***.com/questions/5072905/…【参考方案2】:

你可以这样做:

@for (int i = 0; i < Model.Guests.Count; i++) 
  @Html.TextBoxFor(m => m.Guests.ToList()[i].FirstName)

Haacked 在this post 上有更多示例和详细信息。

更新:控制器发布操作应如下所示:

[HttpPost]
public ActionResult Index(Room room)

    return View();

在这个例子中,我考虑你有一个这样的 Room 类:

public class Room

    public List<Guest> Guests  get; set; 

就是这样,在 post 操作中,您应该正确填充 Guest 列表。

【讨论】:

我喜欢!介意告诉我如何在 POST 之后的 action 方法的另一边捕获这个吗? 阅读模型绑定。这比你想象的要容易。 encrypted.google.com/… 已更新。顺便说一句,我上面链接的帖子有这个答案。

以上是关于如何在 ASP.NET MVC 中使用多个表单元素的主要内容,如果未能解决你的问题,请参考以下文章

在后端 ASP.NET MVC (MEF) 上发布/绑定多个表单

从 ASP.NET MVC Web API 中的多个表单数据键接收文件

如何在不刷新的情况下使用 Ajax 在 ASP.NET MVC 中保存表单数据

Asp.net Mvc post表单提交多个实体模型

如何在不刷新的情况下使用Ajax在ASP.NET MVC中保存表单数据

在 ASP.NET MVC Preview 4 中使用路由引擎进行表单提交