使用复选框保存到 m-2-m

本文关键字:m-2-m 保存 复选框 | 更新日期: 2023-09-27 18:31:56

>所以我试图使用[Slauma的答案][1]

到目前为止,我所做的,

模型

视图模型潜在客户用户

    public int Id { get; set; }
    public string User { get; set; }
    public IEnumerable<ViewModelUserProspectSelect> Prospects { get; set; }
模型

视图模型用户潜在客户选择

    public int ProspectID { get; set; }
    public string Name { get; set; }
    public bool IsSelected { get; set; }

查看潜在客户中的用户

@model OG.ModelView.ViewModelProspectUsers
@using (Html.BeginForm())
{
<div class="container">
    <div class="contentContainer">
        @Html.HiddenFor(model => model.Id)
        Prospects for User <h3>@Html.DisplayTextFor(model => model.User)</h3>
    </div>
    <div class="contentContainer2">
        <h5>Please Select Prospects you wish to assign to this User.</h5>
        <p></p>
            @Html.EditorFor(model => model.Prospects)
    </div>
    <input type="submit" value="Save changes" />
    @Html.ActionLink("Cancel", "Index")
</div>
}

编辑器视图位于 ChangeUserInfo/EditorTemplates/*_ViewModelUserprospectSelect.cshtml* 下

@model OG.ModelView.ViewModelUserProspectSelect
@Html.HiddenFor(model => model.ProspectID)
@Html.HiddenFor(model => model.Name)
test
@Html.LabelFor(model => model.IsSelected, Model.Name)
@Html.EditorFor(model => model.IsSelected)

[获取] 方法 用户在潜在客户操作

public ActionResult UsersInProspect(int id = 0)
    {
        var data = db.UserProfiles
        .Where(s => s.UserID == id)
        .Select(s => new
        {
            ViewModel = new ViewModelProspectUsers
            {
                Id = s.UserID,
                User = s.UserName
            },
            prospects = s.Prospects.Select(c => c.ProspectID)
        })
        .SingleOrDefault();
        if (data == null)
            return HttpNotFound();
        // Load all companies from the DB
        data.ViewModel.Prospects = db.Prospect
            .Select(c => new ViewModelUserProspectSelect
            {
                ProspectID = c.ProspectID,
                Name = c.ProspectName
            })
            .ToList();
        // Set IsSelected flag: true (= checkbox checked) if the company
        // is already related with the subscription; false, if not
        foreach (var c in data.ViewModel.Prospects)
            c.IsSelected = data.prospects.Contains(c.ProspectID);
        return View(data.ViewModel);
    }

[HttpPost] 方法 UserInProspect Action

    public ActionResult UsersInProspect(ViewModelProspectUsers viewModel)
    {
        if (ModelState.IsValid)
        {
            var subscription = db.UserProfiles.Include(s => s.Prospects)
                .SingleOrDefault(s => s.UserID == viewModel.Id);
            if (subscription != null)
            {
                // Update scalar properties like "Amount"
                //subscription.Prospects = viewModel.Prospects;
                //subscription. = subscription.
                //List<string> myList = new List<string>();
                //myList = viewModel.Prospects.Cast<String>().ToList();
                //IEnumerable<dbProspect> Isubscription = subscription.Prospects;
                ////or explicit:
                //var iPersonList = (IEnumerable<dbProspect>)myList;

                // or more generic for multiple scalar properties
                // _context.Entry(subscription).CurrentValues.SetValues(viewModel);
                // But this will work only if you use the same key property name
                // in ViewModel and entity
                foreach (var prospect in viewModel.Prospects)
                {
                    if (prospect.IsSelected)
                    {
                        if (!subscription.Prospects.Any(
                            c => c.ProspectID == prospect.ProspectID))
                        {
                            // if company is selected but not yet
                            // related in DB, add relationship
                            var addedProspect = new dbProspect { ProspectID = prospect.ProspectID };
                            db.Prospect.Attach(addedProspect);
                            subscription.Prospects.Add(addedProspect);
                        }
                    }
                    else
                    {
                        var removedProspect = subscription.Prospects
                            .SingleOrDefault(c => c.ProspectID == prospect.ProspectID);
                        if (removedProspect != null)
                            // if company is not selected but currently
                            // related in DB, remove relationship
                            subscription.Prospects.Remove(removedProspect);
                    }
                }
                db.SaveChanges();
            }
            return RedirectToAction("Index");
        }
        return View(viewModel);
    }

使用复选框保存到 m-2-m

添加了对我的控制器的引用 奥格。视图.更改用户信息.编辑器模板;

再次删除它。"编辑器模板"不应该是一个命名空间。

在下添加了编辑器模板 视图/更改用户/信息/编辑器模板/视图模型用户前景选择.cs

"编辑器模板"不是 C# ( .cs ) 代码文件,而是 Razor 视图 ( .cshtml )。将文件ViewModelUserProspectSelect.cs移动到 ViewModelProspectUsers.cs所在的文件夹,并将其命名空间更改为两个类的相同 (OG.Models )。

(为什么路径中有子文件夹/Info/???还是错别字,只是Views/ChangeUsersInfo/EditorTemplates的意思?我假设控制器有名字ChangeUsersInfoController,对吧?

然后在 Views/ChangeUsersInfo/EditorTemplates 文件夹中创建一个新文件ViewModelUserProspectSelect.cshtml,其中包含另一个答案(以下答案)的视图:

@model OG.Models.ViewModelUserProspectSelect
@Html.HiddenFor(model => model.ProspectID)
@Html.HiddenFor(model => model.Name)
@Html.LabelFor(model => model.IsSelected, Model.Name)
@Html.EditorFor(model => model.IsSelected)

主视图中的div 元素contentContainer2应如下所示:

<div class="contentContainer2">
    <h5>Please Select Prospects you wish to assign to this User.</h5>
    @Html.EditorFor(model => model.Propects)
</div>