C# 我应该使用Html.CheckBox还是Html.CheckBoxFor?
我有一个视图,当用户点击submit时,它会将文本框和复选框中的数据发回并保存到我的db中。当第一次加载视图时,一些文本框会为用户加载数据库中的数据,我还希望预先选中某些复选框。以下是迄今为止我在Get方法中得到的信息:C# 我应该使用Html.CheckBox还是Html.CheckBoxFor?,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个视图,当用户点击submit时,它会将文本框和复选框中的数据发回并保存到我的db中。当第一次加载视图时,一些文本框会为用户加载数据库中的数据,我还希望预先选中某些复选框。以下是迄今为止我在Get方法中得到的信息: //vm is an object of my ViewModel [HttpGet] public ActionResult AddOrganization(int peopleID = 0) { var peopleModel
//vm is an object of my ViewModel
[HttpGet]
public ActionResult AddOrganization(int peopleID = 0)
{
var peopleModel = db.People.Include("EmployeeContacts").Single(g => g.PeopleID == peopleID);
var contactModel = db.EmployeeContacts.Include("People").Single(g => g.PeopleID == peopleID);
vm.People = new People();
vm.EmployeeContacts = new EmployeeContacts();
vm.OrganizationsOptions = new OrganizationOptions();
// grabs info from db to be populated in the view
vm.People.NID = peopleModel.NID;
vm.People.FirstName = peopleModel.FirstName;
vm.People.LastName = peopleModel.LastName;
vm.People.SID = peopleModel.SID;
vm.EmployeeContacts.Email = contactModel.Email;
vm.EmployeeContacts.PrimaryPhone = contactModel.PrimaryPhone;
var list = new List<AddOrganizationViewModel>
{
new AddOrganizationViewModel{ID = 1, Name = "Admin", AdminChecked = true},
new AddOrganizationViewModel{ID = 2, Name = "Breakdown Report", BreakdownReportChecked = true},
new AddOrganizationViewModel{ID = 3, Name = "Favorites", FavoritesChecked = true},
new AddOrganizationViewModel{ID = 4, Name = "Site Admin", SiteAdminChecked = false},
};
return View("../Setup/AddOrganization", vm);
}
这是我的视图中包含复选框的部分,但是我不确定我需要在这里做什么才能将我的ViewModel、Controller和view链接在一起,因为视图需要一种AddOrganizationViewModel类型,所以我也一直在想如何发送复选框列表
@model Music.ViewModels.AddOrganizationViewModel
@using (Html.BeginForm("AddOrganization", "AddOrganization")){
@Html.AntiForgeryToken()
<legend>OPTIONS</legend>
<div>
@Html.Label("Features: Admin")
@Html.CheckBoxFor(Model => Model.AdminChecked)
</div>
<div>
@Html.Label("Features: Breakdown Report")
@Html.CheckBoxFor(Model => Model.BreakdownReportChecked)
</div>
<div>
@Html.Label("Features: Favorites")
@Html.CheckBoxFor(Model => Model.FavoritesChecked)
</div>
<div>
@Html.Label("Features: Site Admin")
@Html.CheckBoxFor(Model => Model.SiteAdminChecked)
</div>
}
@model Music.ViewModels.AddOrganizationViewModel
@使用(Html.BeginForm(“AddOrganization”、“AddOrganization”)){
@Html.AntiForgeryToken()
选择权
@Label(“功能:Admin”)
@Html.CheckBoxFor(Model=>Model.AdminChecked)
@标签(“功能:细分报告”)
@CheckBoxFor(Model=>Model.BreakdownReportChecked)
@标签(“功能:收藏夹”)
@Html.CheckBoxFor(Model=>Model.FavoritesChecked)
@标签(“功能:站点管理员”)
@Html.CheckBoxFor(Model=>Model.SiteAdminChecked)
}
编辑:更新代码以反映我使用CheckBoxFor所做的更改。您不应该对所有复选框使用1个通用属性 我只需要在viewmodel中为您希望用户能够访问的每个功能创建一个布尔属性
public class AddOrganizationViewModel
{
public Music.Models.Organizations Organizations { get; set; }
public Music.Models.People People { get; set; }
public Music.Models.OrganizationOptions OrganizationsOptions { get; set; }
public Music.Models.EmployeeContacts EmployeeContacts { get; set; }
public int ID { get; set; }
public string Name { get; set; }
public bool HasAdminPermissions{ get; set; }
public bool HasSomeOtherPermission{ get; set; }
//etc.. for other checkboxes you might need.
}
要预先填充这些复选框,请使用我们在viewmodel中创建的属性在控制器中设置它们:
vm.HasSomeOtherPermission = true;
//etc for other properties
最后,在视图中,将@Html.CheckBox
更改为@Html.CheckBoxFor
。
然后,您可以仅使用viewmodel上的boolen属性来渲染复选框:
<legend>OPTIONS</legend>
@*Look into @html.checkboxfor *@
<div>
@Html.Label("Features: Admin")
@Html.CheckBoxFor(x => x.HasAdminPermissions)
</div>
<div>
@Html.Label("Features: Breakdown Report")
@Html.CheckBoxFor(x => x.HasSomeOtherPermission)
</div>
选项
@*查看@html.checkboxfor*@
@Label(“功能:Admin”)
@CheckBoxFor(x=>x.HasAdminPermissions)
@标签(“功能:细分报告”)
@CheckBoxFor(x=>x.HasSomeOtherPermission)
你的意思是CheckBoxFor(x=>x.HasAdminPermissions)
?@Nick是的,刚刚注意到:)谢谢,我像你说的那样改变了我的观点,并使用了@Html.CheckBoxFor指令,但所有的复选框仍然没有选中。我不需要做些什么来将列表发送到视图,还是因为列表的类型为AddOrganizationViewModel而自动发生?您是否修改了控制器中设置viewmodel的部分?我在答案的第二个代码块中写了一个小例子。我编辑了我的答案以显示我所做的更改。我只关心是否选中复选框:这些复选框不适用于不同级别的权限,尽管这是一个很好的建议。相反,我将属性名称更改为更具反射性,并更改了控制器、ViewModel和视图中的属性。据我所知,我的列表看起来就像你的第二个代码块。
<legend>OPTIONS</legend>
@*Look into @html.checkboxfor *@
<div>
@Html.Label("Features: Admin")
@Html.CheckBoxFor(x => x.HasAdminPermissions)
</div>
<div>
@Html.Label("Features: Breakdown Report")
@Html.CheckBoxFor(x => x.HasSomeOtherPermission)
</div>