保存到m-2-m的具有复选框 [英] Saving to m-2-m with checkboxes

查看:173
本文介绍了保存到m-2-m的具有复选框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

是我迄今所做的,

型号 ViewModelProspectUsers

 公众诠释标识{搞定;组; }
    公共字符串用户{搞定;组; }
    公共IEnumerable的< ViewModelUserProspectSelect>展望{搞定;组; }

型号 ViewModelUserProspectSelect

 公众诠释ProspectID {搞定;组; }
    公共字符串名称{;组; }
    公共BOOL IsSelected {搞定;组; }

查看 UserInProspect

  @model OG.ModelView.ViewModelProspectUsers@using(Html.BeginForm())
{< D​​IV CLASS =容器>
    < D​​IV CLASS =contentContainer>
        @ Html.HiddenFor(型号=> model.Id)
        展望用户和LT; H3> @ Html.DisplayTextFor(型号=> model.User)LT; / H3 GT&;
    < / DIV>
    < D​​IV CLASS =contentContainer2>
        < H5>请选择您的前景要分配给该用户< / H5>
        &所述p为H.;&下; / P>            @ Html.EditorFor(型号=> model.Prospects)    < / DIV>
    <输入类型=提交值=保存更改/>
    @ Html.ActionLink(取消,索引)
< / DIV>
}

编辑器查看位于下ChangeUserInfo / EditorTemplates / * _ * ViewModelUserprospectSelect.cshtml

  @model OG.ModelView.ViewModelUserProspectSelect@ Html.HiddenFor(型号=> model.ProspectID)
@ Html.HiddenFor(型号=> model.Name)
测试
@ Html.LabelFor(型号=> model.IsSelected,Model.Name)
@ Html.EditorFor(型号=> model.IsSelected)

[获取] 方法的 UserInProspect 的操作

 公众的ActionResult UsersInProspect(INT ID = 0)
    {
        VAR数据= db.UserProfiles
        。凡(S => s.UserID == id)的
        。选择(S = GT;新
        {
            视图模型=新ViewModelProspectUsers
            {
                ID = s.UserID,
                用户= s.UserName
            },
            前景= s.Prospects.Select(C => c.ProspectID)
        })
        .SingleOrDefault();        如果(数据== NULL)
            返回HttpNotFound();        //将数据库的所有公司
        data.ViewModel.Prospects = db.Prospect
            。选择(C =>新建ViewModelUserProspectSelect
            {
                ProspectID = c.ProspectID,
                名称= c.ProspectName
            })
            .ToList();        //设置IsSelected标志:真(=复选框选中),如果该公司
        //已经与订阅相关;假,如果不
        的foreach(在data.ViewModel.Prospects变种C)
            c.IsSelected = data.prospects.Contains(c.ProspectID);        返回查看(data.ViewModel);    }

[HttpPost] 方法的 UserInProspect 的操作

 公众的ActionResult UsersInProspect(ViewModelProspectUsers视图模型)
    {
        如果(ModelState.IsValid)
        {
            VAR订阅= db.UserProfiles.Include(S = GT; s.Prospects)
                .SingleOrDefault(S => s.UserID == viewModel.Id)​​;            如果(订阅!= NULL)
            {
                //更新标量的属性,如金额
                //subscription.Prospects = viewModel.Prospects;
                //订阅。 =订阅。
                //列表<串GT; myList中=新名单<串GT;();
                // myList中= viewModel.Prospects.Cast<串GT;()了ToList()。                // IEnumerable的< dbProspect> Isubscription = subscription.Prospects;
                ////或显式:
                // VAR iPersonList =(IEnumerable的< dbProspect>)myList中;
                //或多个标量属性更通用
                // _context.Entry(订阅).CurrentValues​​.SetValues​​(视图模型);
                //但是如果你使用相同的密钥属性名这只会工作
                //在视图模型和实体                的foreach(在viewModel.Prospects VAR前景)
                {
                    如果(prospect.IsSelected)
                    {
                        如果(!subscription.Prospects.Any(
                            C => c.ProspectID == prospect.ProspectID))
                        {
                            //如果公司被选中,但尚未
                            //在DB相关,加关系
                            VAR addedProspect =新dbProspect {ProspectID = prospect.ProspectID};
                            db.Prospect.Attach(addedProspect);
                            subscription.Prospects.Add(addedProspect);
                        }
                    }
                    其他
                    {
                        VAR removedProspect = subscription.Prospects
                            .SingleOrDefault(C => c.ProspectID == prospect.ProspectID);
                        如果(removedProspect!= NULL)
                            //如果公司没有选择,但目前
                            //在DB的关系,删除关系
                            subscription.Prospects.Remove(removedProspect);
                    }
                }                db.SaveChanges();
            }            返回RedirectToAction(「指数」);
        }        返回视图(视图模型);
    }


解决方案

  使用

中加入参考我的控制器
  OG.Views.ChangeUsersInfo.EditorTemplates;


再删除。 EditorTemplates不应该是一个命名空间。


  在

添加编辑模板
  查看/ ChangeUsers /信息/ EditorTemplates / ViewModeluserProspectSelect.cs


这是编辑模板,是不是C#(的.cs )code文件,但剃刀视图( .cshtml )。文件 ViewModelUserProspectSelect.cs 移至文件夹,其中还 ViewModelProspectUsers.cs 是并更改其命名空间相同的两个类( OG.Models )。

(为什么有一个子文件夹 /信息/ 的路径?或者是一个错字,只是查看/ ChangeUsersInfo / EditorTemplates 意思?我认为控制器具有名称 ChangeUsersInfoController ,对吧?)

然后创建一个包含该视图的查看/ ChangeUsersInfo / EditorTemplates 文件夹中的新文件 ViewModelUserProspectSelect.cshtml 对方的回答,这其中:

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

以及 contentContainer2 在主视图div元素应该是这样的:

 < D​​IV CLASS =contentContainer2>
    < H5>请选择您的前景要分配给该用户< / H5>    @ Html.EditorFor(型号=> model.Propects)
< / DIV>

So i'm trying to use [Slauma's Answer][1]

What i have done so far,

Model ViewModelProspectUsers

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

Model ViewModelUserProspectSelect

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

View UserInProspect

@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>
}

Editor View Located under 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)

[Get] Method UserInProspect Action

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] Method 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);
    }

解决方案

Added Reference to my Controller using OG.Views.ChangeUsersInfo.EditorTemplates;

Remove that again. "EditorTemplates" should not be a namespace.

Added Editor Template under Views/ChangeUsers/Info/EditorTemplates/ViewModeluserProspectSelect.cs

An "editor template" isn't a C# (.cs) code file but a Razor view (.cshtml). Move the file ViewModelUserProspectSelect.cs to the folder where also ViewModelProspectUsers.cs is and change its namespace to the same for both classes (OG.Models).

(Why is there a subfolder /Info/ in the path??? Or is it a typo and just Views/ChangeUsersInfo/EditorTemplates is meant? I assume that the controller has the name ChangeUsersInfoController, right?)

Then create a new file ViewModelUserProspectSelect.cshtml in the Views/ChangeUsersInfo/EditorTemplates folder that contains the view from the other answer, this one:

@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)

And the contentContainer2 div element in your main view should look like this:

<div class="contentContainer2">
    <h5>Please Select Prospects you wish to assign to this User.</h5>

    @Html.EditorFor(model => model.Propects)
</div>

这篇关于保存到m-2-m的具有复选框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆