【问题标题】:How can i send back a model containing two lists from the view to my controller如何将包含两个列表的模型从视图发送回我的控制器
【发布时间】:2019-12-19 02:13:33
【问题描述】:

我有一个 cshtml 视图,我正在为此发送一个视图模型。该视图模型由两个专辑列表(音乐专辑)组成。然后,我要求用户最多选中其中 3 张专辑(标题旁边的复选框)以投票选出他最喜欢的音乐。我使用 javascript 来确保他检查的次数不超过 3(安全性现在是一个细节,我更关心让它发挥作用,但如果人们有更好的解决方案,我愿意接受建议)。

由于所有专辑都显示在一个表格中,我很想通过提交按钮将更新后的相同模型发送回控制器。

基本上,其中一个列表包含用户在加载页面之前所做的当前投票(可以为空),第二个应该为空,直到发送回包含当前选择的投票列表的控制器。然后我使用这两个列表来比较它们并更新数据库,删除他删除的投票,并添加他添加的投票。

但由于我不习惯表格,我无法创建合适的表格来返回这些信息。

我试图将整个列表放入一个表单中,但没有成功。当我寻找“将模型发送回控制器”时,我的研究通常会这样做并让它工作。

查看模型

public class CategoryVotesUserViewModels
{
    public CategoryVoteViewModels categoryVoteViewModels;
    public List<int> listVotesEntry = new List<int>();
    public List<int> listVotesOutput = new List<int>();
}

相关的CSHTML和javascript

@section Header{
    <script>
        var MAX_VOTES = 3;

        function checkNumberVotes($this) {

            console.log($("input[name='listVoteOutput']:checked"));
            if ($("input[name='listVoteOutput']:checked").length > MAX_VOTES) {
                $this.checked = false;
            }
        }
    </script>
}

@using (Html.BeginForm("VoteInCategory", "Votes", new { SearchModel = Model }, FormMethod.Post))
{
    <ul>

        @foreach (var av in Model.categoryVoteViewModels.listVotes)
        {
            <li>
                @av.album.Title | @av.votes |
                <input type="checkbox"
                       name="listVoteOutput"
                       value=@av.album.ID
                       onclick="checkNumberVotes(this)"
                       @if (Model.listVotesEntry.Contains(av.album.ID))
                       { <text> checked </text> } />
            </li>
         }
    </ul>
    <div class="form-group text-center">
        <input type="submit" class="btn btn-primary" value="Submit" />
    </div>
}

控制器

[HttpPost]
public ActionResult VoteInCategory(CategoryVotesUserViewModels categoryVotesUserViewModels)
{
    if (ModelState.IsValid)
    {
        List<int> toAdd = categoryVotesUserViewModels.listVotesOutput.Except(categoryVotesUserViewModels.listVotesEntry).ToList();
        List<int> toRemove = categoryVotesUserViewModels.listVotesEntry.Except(categoryVotesUserViewModels.listVotesOutput).ToList();

        VoteService.updateVoteUserCategory(User.Identity.GetUserId(), toRemove, toAdd, categoryVotesUserViewModels.categoryVoteViewModels.categoryID);

        //TODO Redirect to success
        return RedirectToAction("Index", "Home");
     }

    return View(categoryVotesUserViewModels);
}

如果用户已经投票,则应开始检查 ID 在“ListVotesEntry”中的所有专辑。如果用户没有投票,或者之前没有投票,“ListVotesEntry”应该是空的。

当用户按下提交按钮时,如果选中了专辑,则专辑的 id 应添加到“ListVotesOutput”列表中。此外,“ListVotesEntry”和“ListVotesOutput”都应发送回控制器。对于其余的处理,不再需要包含专辑名称及其标题/ID 的列表

【问题讨论】:

    标签: c# razor model-view-controller controller html.beginform


    【解决方案1】:

    找到了解决办法。问题是我的模型需要在其属性上使用“{get; set;}”,否则绑定不起作用,这意味着它会发回一个空模型。

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多