【问题标题】:How can I post changes to a list of players to database?如何将更改的玩家列表发布到数据库?
【发布时间】:2018-08-02 09:44:11
【问题描述】:

我想将数据发布到数据库,但我的视图模型在发布到控制器时是空的,我尝试了不同的方法,但每次我的视图模型都是空的。

这些是我的课:

 public class Player
 {      
    [Key]
    public int Id { get; set; }

    public string Name{ get; set; }

    public string PreName{ get; set; }
 }

public class Activitity
{
    [Key]
    public int Id { get; set; }

    public string WhichActivity { get; set; }

    public List<Player> Players { get; set; }
}

public class Aanwezigheid
{
    [Key]
    public int Id { get; set; }
    public ReasonEnum Reason{ get; set; }

    public int PlayerId{ get; set; }
    public Player Player{ get; set; }
    public List<Player> Players{ get; set; }

    public int ActivityId { get; set; }
}

我的视图模型:

public class PresenceVM
{
    public int PlayerId{ get; set; }

    public int ActivityId { get; set; }

    public string Name{ get; set; }

    public string PreName { get; set; }

    public ReasonEnum Reason { get; set; }
}

我的 HTTPGET 获取玩家列表,我想将玩家缺席原因放入数据库中。

[HttpGet]
public ActionResult Presence(int id)
{
    var sp = _context.Players.ToList();

    foreach(Players s in sp)
    {
        var van = new PresenceVM
        {
            PlayerId = s.Id,
            Name = s.Name,
            PreName = s.PreName,
            ActivityId = id
        };

        list.Add(van);
    }

    return View(list);
}

我的 HttpPost

[HttpPost]
public ActionResult Presence(List<PresenceVM> list)
{
    var sp = _context.Players.ToList();
    var list = new List<Presence>();

    foreach (Players s in sp)
    {
        var van = new Aanwezigheid
        {
            PlayerId = s.Id,
            ActivityId = vm.ActivityId,
            Reason = vm.Reason
        };

        list.Add(van);
        _context.Presence.Add(van);
        //_context.SaveChanges();
    }

    return RedirectToAction("Index", "Presence");
}

问题是我的 PresenceVm (viewmodel) 没有在我的控制器中获取任何数据。我不明白为什么?是因为一个清单吗?使用一个项目很容易将其发布到数据库。可能有多个项目?

编辑 1:

Get & Post 的视图模型

@model IEnumerable<....ViewModels.PresenceVM>

@{
    ViewBag.Title = "Presence";
}

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.PreName)
        </th>
        <th>
            @Html.DisplayName("Reason")
        </th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PreName)
            </td>
            <td>
                @Html.EnumDropDownListFor(modelItem => item.Reason, "Present", new { @class = "form-control" })
            </td>
        </tr>
    }

</table>

<form action="/Presences/Presence" method="post">
    <div class="form-horizontal form-details">
        <input type="submit" value="Save" class="btn btn-default" />
    </div>
</form>

【问题讨论】:

  • 可能视图有@model IEnumerable&lt;PresenceVM&gt;,但它里面的助手没有正确绑定的命名索引(请显示视图代码以确保)。
  • 传入视图的模型:@model IEnumerable<....viewmodels.presencevm>
  • 我猜在您看来,您使用的是@foreach。改用@for 试试
  • 好吧,正如预期的那样,您在视图中使用了@foreach (var x in Model)。尝试使用@for (var i = 1; i &lt; Model.Count; i++) 并为每个模型属性(例如model[i].PlayerId)放置索引。
  • 您的 POST 视图中需要一个表单。没有表单,你怎么能把 smth 发布到服务器上?

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


【解决方案1】:

您将表单范围放在错误的位置(仅包括提交按钮)。正确的方式应该包括所有你想用索引提交的属性(因为你使用的是IEnumerable&lt;PresenceVM&gt;,比如这个例子:

<form action="/Presences/Presence" method="post">
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.PreName)
            </th>
            <th>
                @Html.DisplayName("Reason")
            </th>
        </tr>
    @for (var i = 0; i < Model.Count; i++)
    {
        <tr>
            <td>
                @Html.EditorFor(modelItem => item[i].Name)
            </td>
            <td>
                @Html.EditorFor(modelItem => item[i].PreName)
            </td>
            <td>
                @Html.EnumDropDownListFor(modelItem => item[i].Reason, "Present", new { @class = "form-control" })
            </td>
        </tr>
    }

    </table>

    <div class="form-horizontal form-details">
        <input type="submit" value="Save" class="btn btn-default" />
    </div>
</form>

请注意,如果要允许用户输入,则需要将所有DisplayFor 更改为EditorFor

【讨论】:

    【解决方案2】:

    您的 Presence 方法正在返回一个不存在的对象(列表)。 如果你想在 post 方法中使用它,它必须返回视图模型。

    [HttpGet]
    public ActionResult Presence(int id)
    {
      List<PresenceVM> model = context.Players.Select(u => new PresenceVM
                               {
                                 PlayerId = s.Id,
                                 Name = s.Name,
                                 PreName = s.PreName,
                                 ActivityId = id
                               }).ToList();
    
       return View(model);
    }
    

    【讨论】:

    • 这个,你真的不知道。也许list 是某个地方的一些静态列表(尽管您的代码看起来更干净)。
    • 你能解释一下吗?因为不清楚你在说什么
    • 你说list“一个不存在的对象”。你没有控制器的完整代码,所以你无法知道它是否存在
    • 嗯,好的。你有一定道理。我只是根据我在一般代码中看到的内容发表评论。
    • 不相关:当您在下一行覆盖 model 时,是否有任何理由创建 new List&lt;PresenceVM&gt;()
    【解决方案3】:

    看来你不用Formtag

    查看

    @model MyViewModel
    @using (Html.BeginForm(("Presence"))
    {
        @Html.AntiForgeryToken()
    
        //divs
    
        <div class="form-horizontal form-details">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    }
    

    传递Model 比传递Model 列表更好

    视图模型

    public class MyViewModel{
        public IList<PresenceVM> MyList {get;set;}
    }
    

    控制器

    public ActionResult Presence(MyViewModel xxx)
    {
        //whatever
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2021-11-13
      • 2016-01-06
      相关资源
      最近更新 更多