だから私は[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);
}