1

だから私は[Slauma's Answer][1]を使おうとしています

私がこれまでやってきたこと、

モデル ビューModelProspectUsers

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

モデル ビューModelUserProspectSelect

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

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

エディター ビュー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]メソッドUserInProspectアクション

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アクション

    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);
    }
4

1 に答える 1

2

OG.Views.ChangeUsersInfo.EditorTemplates; を使用してコントローラーへの参照を追加しました。

それをもう一度削除します。「EditorTemplates」は名前空間であってはなりません。

Views/ChangeUsers/Info/EditorTemplates/ViewModeluserProspectSelect.cs の下にエディター テンプレートを追加しました。

「エディター テンプレート」は C# ( .cs) コード ファイルではなく、Razor ビュー ( .cshtml) です。ViewModelUserProspectSelect.csもあるフォルダーにファイルを移動しViewModelProspectUsers.cs、名前空間を両方のクラスで同じに変更します ( OG.Models)。

(パスにサブフォルダーがあるのはなぜですか/Info/???それともタイプミスで、単にViews/ChangeUsersInfo/EditorTemplates意図されたものですか?コントローラーの名前は だと思いますよChangeUsersInfoControllerね?)

次に、他の回答からのビューを含むフォルダーに新しいファイルViewModelUserProspectSelect.cshtmlを作成します。これは次のとおりです。Views/ChangeUsersInfo/EditorTemplates

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

メイン ビューのcontentContainer2div 要素は次のようになります。

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

    @Html.EditorFor(model => model.Propects)
</div>
于 2013-09-20T20:50:06.347 に答える