【发布时间】:2013-09-24 19:59:41
【问题描述】:
所以我正在尝试使用 [Slauma's Answer][1]
到目前为止我做了什么,
模型 ViewModelProspectUsers
public int Id { get; set; }
public string User { get; set; }
public IEnumerable<ViewModelUserProspectSelect> Prospects { get; set; }
模型 ViewModelUserProspectSelect
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);
}
【问题讨论】:
-
当你说“...我的前景是空的”你是指
viewModel.Prospects还是subscription.Prospects? -
subscription.Prospects抱歉没有澄清,我认为问题是我正在使用列表并且不明白如何设置我的列表viewModel.Prospects= IenumerableSubscription.prospects -
嗯,但这看起来是一个非常不同的问题。您正在从数据库加载订阅包括潜在客户:
subscription = db.UserProfiles.Include(s => s.Prospects)...。subscription.Prospects绝不能是null,即使数据库中没有潜在客户。那么它可能是一个空集合,但绝不是null。你真的是说null,而不是“空集合”??? -
值不再为 Null。我对代码进行了一些更改,发现我现在在
viewModel(在 Post 方法开始之后)我检查了我的值,我的viewModel.ProspectID是 0viewModel.Names是“”。但所选值正在正确发布。然后我假设因为 id 是 null 并且在数据库中不存在,所以没有任何改变。 -
您是否真的在我的回答中使用了编辑器模板中的方法?在这种情况下,Id 和 Name 都不应该为空,因为我已将它们作为隐藏字段放入视图中(
@Html.HiddenFor(model => model.CompanyId)和@Html.HiddenFor(model => model.Name))。或者您是否使用了第二个链接中的解决方案? Name 那里没有隐藏字段,因此很明显您不会在 POST 上获取此值。但是 Id 有一个隐藏字段,所以它不应该是 0。
标签: c# asp.net-mvc post checkbox many-to-many