【问题标题】:ASP.Net MVC with Multiple Models具有多个模型的 ASP.Net MVC
【发布时间】:2015-02-12 09:30:42
【问题描述】:

查看:

@model MyApp.Models.Activity

@using (Html.BeginForm("Activity_Details", "Activity", FormMethod.Post))
{
    @Html.ValidationSummary(true)
    @Html.AntiForgeryToken()

    @Html.HiddenFor(model => model.ActivityName)
    @Html.HiddenFor(model => model.ActDate)
    @Html.HiddenFor(model => model.DateAccomplished)

    @Html.HiddenFor(model => model.Participants)

    <div class="body-header">
       <div>
            <h2>Activity Information</h2>
       </div>
       <br />
        <div class="buttons">
            <input type="submit" name="submitButton" value="Save" class="button save icon" />
            <a class="button" href="@Url.Action("Activity_List", "Activity")"><span class="back icon"></span>Back</a>
        </div>
    </div>
    <br />
    <div class="content-wrapper">
       <div class="sub-content">
            <div class="item">
                <span>@Html.DisplayNameFor(model => model.ActivityName)</span>
                @Html.DisplayFor(model => model.ActivityName)
            </div>
            <div class="item">
                <span>@Html.DisplayNameFor(model => model.ActDate)</span>
                @Html.DisplayFor(model => model.ActDate)
            </div>
            <div class="item">
                <span>@Html.DisplayNameFor(model => model.DateAccomplished)</span>
                @Html.DisplayFor(model => model.DateAccomplished)
            </div>
       </div>
       <div class="sub-content">
            <table cellspacing="0">
                <thead>
                    <tr>
                        <th>Last Name</th>
                        <th>First Name</th>
                        <th>Actual Amount</th>
                    </tr>
                </thead>
                <tbody>
                @foreach (var item in Model.Participants)
                {
                    <tr>
                        <td>@item.LastName</td>
                        <td>@item.FirstName</td>
                        <td>@item.Amount</td>
                    </tr>
                }
                </tbody>
            </table>
        </div>
    </div>
}

控制器:

[HttpPost()]
public ActionResult Activity_Details(string submitButton, Activity model)
{
    //AFTER CLICKING THE SUBMIT BUTTON
    //model.Participants doesnt retained its values
    return View(model);
}

public class Activity
{
    public string ActivityName { get; set; }
    public DateTime ActDate { get; set; }
    public DateTime DateAccomplished { get; set; }

    public virtual IEnumerable<Participant> Participants { get; set; }
}

public class Participant
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Amount { get; set; }
}

我有这些模型活动和参与者,它们将显示在一个视图中,参与者模型将迭代以创建一个表。

我现在的问题是我需要在单击提交按钮后更新每个参与者的“金额”,而现在发生的事情是当模型被传递回 ActionResult...参与者模型为空并且只有活动模型有数据。

【问题讨论】:

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


【解决方案1】:

这里有很多问题。首先,您不能将模型绑定到 IEnumerable,因为模型绑定器不知道要实例化哪种实际对象来支持它。使用List&lt;Participant&gt;Collection&lt;Participant&gt;

其次,您不能将 HiddenFor 与集合或 IEnumerable 一起使用。您只能在其中放置一个谨慎的类型。您需要将列表中的每个参与者写入单独的HiddenFor()。无论如何,这可能毫无意义,因为在大多数情况下,无论如何您都在服务器上拥有此信息,因此没有理由将其发布回服务器。特别是在这里,您正在显示数据,而不是更新它...

如果用户可以更改或选择它,您只需要回传数据(在这种情况下您只是发布选择机制,例如 Id)

【讨论】:

  • 是的,它有效!而不是 IEnumerable 我将其更改为 List 并且它不再是 null 了。谢谢!
【解决方案2】:

你需要的是一种叫做列表绑定的东西。这个:

 @foreach (var item in Model.Participants)
 {
     <tr>
          <td>@item.LastName</td>
          <td>@item.FirstName</td>
          <td>@item.Amount</td>
      </tr>
  }

没有发回任何数据。试试:

@for( int i = 0; i < Model.Participants.Count(); ++i)
{
    @Html.HiddenFor(m => m.Participants[i].LastName)
    @Html.HiddenFor(m => m.Participants[i].FirstName)
    @Html.HiddenFor(m => m.Participants[i].Amount)
}

确保i 是按顺序递增的,默认的活页夹会很乐意接受它。

您可以应用其他方法,但这是最简单的。

【讨论】:

  • 我使用了您的解决方案,但我使用了 modelItem.TargetMDs.ElementAt(i) 而不是 m.Participants[i] 但在提交之后仍然...Model.Participants 为空。
  • @user3035024 - 所以,你的意思是你做了建议的事情,除了你做了一些与建议完全不同的事情,你不明白为什么做一些完全不同的事情没有'不行吗?
  • 因为 Indexing 不适用于 IEnumerable
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多