我有一个Location
模型和一个Services
模型,使用app的上下文类我可以在该位置的create方法中对服务模型进行查询,但是如何访问那些结果是一个视图,它是一个与位置相关联的强类型视图?
namespace LocationApp.Models
{
public class Location
{
public Location()
{
this.ServiceAssignments = new HashSet<ServiceAssignment>();
}
public int id { get; set; }
public string name { get; set; }
public bool active { get; set; }
public virtual ICollection<ServiceAssignment> ServiceAssignments { get; set; }
}
}
namespace LocationApp.Models
{
public class Service
{
public Service()
{
this.ServiceAssignments = new HashSet<ServiceAssignment>();
}
public int id { get; set; }
public string name { get; set; }
public string description { get; set; }
public bool active { get; set; }
public string icon { get; set; }
public virtual ICollection<ServiceAssignment> ServiceAssignments { get; set; }
}
}
public ActionResult Create()
{
using (var db = new LocationAppContext())
{
var serv = (from s in db.Services
where s.active == true
select s).ToList();
if (serv.Count > 0)
{
return View(serv);
}
else
{
return View();
}
}
}
答案 0 :(得分:0)
您需要创建一个新的ViewModel。
public class CreateLocationVM
{
public string Name { set; get;}
public List<SelectedService> Services { set; get;}
public CreateLocationVM()
{
Services=new List<SelectedService>();
}
}
public class SelectedService
{
public int ID { set; get;}
public string Name {set; get;}
public bool IsSelected { set; get;}
}
现在,在 GET 操作中,您可以创建viewmodel的对象并填充Services
集合属性并将其发送到视图。
public ActionResult Create()
{
var vm = new CreateLocationVM();
//The below code is hardcoded for demo. you mat replace with DB data.
vm.Services.Add(new SelectedService{ Name = "Test1" , Id=1});
vm.Services.Add(new SelectedService{ Name = "Test2", Id=2 });
return View(vm);
}
现在让我们创建一个EditorTemplate。转到Views/YourControllerName
并创建一个名为“ EditorTemplate ”的文件夹,并在其中创建一个与属性名称相同名称的新视图名称(SelectedService.cshtml
)
将此代码添加到新的编辑器模板中。
@model SelectedService
<p>
<b>@Model.Name</b> :
@Html.CheckBoxFor(x => x.IsSelected) <br />
@Html.HiddenFor(x=>x.Id)
</p>
现在,在主视图中,使用EditorFor
Html Helper方法调用编辑器模板。
@model CreateLocationVM
<h2>Add Location</h2>
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
</div>
<div>
@Html.EditorFor(m=>m.Services)
</div>
<input type="submit" value="Submit" />
}
现在,当您发布表单时,您的模型将拥有Services
集合,其中所选复选框的True
属性值为IsSelected
。
[HttpPost]
public ActionResult Create(CreateLocationVM model)
{
if(ModelState.IsValid)
{
//Check for model.Services collection and Each items
// IsSelected property value.
//Save and Redirect(PRG pattern)
}
return View(model);
}
您可以从Viewmodel中读取并创建实体并设置正确的值并保存到数据库。