C# MVC无线电按钮
我在看一个教程视频,我只是不明白RadioButton到底发生了什么 基本上,这个家伙创建了一个公司类:C# MVC无线电按钮,c#,asp.net-mvc,C#,Asp.net Mvc,我在看一个教程视频,我只是不明白RadioButton到底发生了什么 基本上,这个家伙创建了一个公司类: public class Company { public string SelectedDepartment {get; set;} public List<Department> Departments { get { SampleDBContext db = new SampleDBCon
public class Company
{
public string SelectedDepartment {get; set;}
public List<Department> Departments
{
get
{
SampleDBContext db = new SampleDBContext();
return db.Departments.ToList();
}
}
}
此[HttpGet]的强类型视图:
@using (Html.BeginForm())
{
foreach (var department in Model.Departments)
{
@Html.RadioButtonFor(m => m.SelectedDepartment, department.Id, (department.IsSelected.HasValue && department.IsSelected.Value) ? new (@checked = "checked")} : null
@department.Name
}
<input type="submit" value="Submit" />[Resulting View][1]
好的,呼。数据库有3列,Id、Name和IsSelected(位类型)
所以,
1.小时
2.工资单..空
3.它是空的
长柱?我希望不是。每件作品都非常直白
现在回答我的问题:
(1) RadioButtonOn()如何使用(m=>m.SelectedDepartment)?与中一样,[HttpPost]方法为什么要检查它的字符串是null还是空的
(2) 在方法中打印company.SelectedDepartment的值时,您将获得ID。此分配在何处进行?需要进行空字符串检查,因为只有选择按钮时,单选按钮的值才会包含在POST中。这对于复选框也是一样的,并且是web标准本身的一部分,而不是MVC
当MVC框架获取提交的值并使用它实例化(POST)索引方法参数类型的新实例时,company.SelectDepartment的值被分配。这是通过将提交数据中的属性名称与参数类型的属性名称进行匹配来实现的。通过对类型化模型使用RadioButtonFor helper方法,您可以保证单选按钮的名称和提交值的名称与Index方法所需的类型匹配。由于单选按钮的值仅包含在POST中,因此需要进行null或空字符串检查。这对于复选框也是一样的,并且是web标准本身的一部分,而不是MVC
当MVC框架获取提交的值并使用它实例化(POST)索引方法参数类型的新实例时,company.SelectDepartment的值被分配。这是通过将提交数据中的属性名称与参数类型的属性名称进行匹配来实现的。通过对类型化模型使用RadioButton帮助器方法,可以保证单选按钮的名称和提交的值的名称与Index方法所需的类型匹配。在视图代码中,缺少视图使用的实际模型的定义。您可以通过添加
@model CompanyNamespace.Company
来实现这一点
m=>m.SelectedDepartment
是一个lambda,用于选择模型的属性,您可以在Post操作中检查该属性,以检索用户选择的单选按钮的值。如果用户没有选择任何单选按钮,则该值为null
(或者通常为default(t)
,在本例中为default(string)
=null
),因此后操作中的if条件为RadioButton的第二个参数指定每个单选按钮的值。因为在您的例子中是department.Id
,所以每个生成的单选按钮的值都是一个部门的Id
[HttpPost]
修饰的操作,模型绑定器通过尝试将复杂对象的参数名称或属性与Post数据匹配,将发布的数据绑定到方法的参数(或多个参数)。因此,当用户选择某个单选按钮时,其值(取自RadioButtonToll指定的部门Id
)被分配给公司。SelectedDepartment
属性
扩展模型绑定的编辑是受@Jaquez的启发,试图提供一个更完整的描述,后来我比较了两者(在OP选择这一部分作为答案之后),在我看来,它在很大程度上是对@Jaquez答案这一部分的重述。我认为这是公平的。在您的视图代码中, 缺少视图所用的实际模型的定义。您可以通过添加
@model CompanyNamespace.Company
来实现这一点
m=>m.SelectedDepartment
是一个lambda,用于选择模型的属性,您可以在Post操作中检查该属性,以检索用户选择的单选按钮的值。如果用户没有选择任何单选按钮,则该值为null
(或者通常为default(t)
,在本例中为default(string)
=null
),因此后操作中的if条件为RadioButton的第二个参数指定每个单选按钮的值。因为在您的例子中是department.Id
,所以每个生成的单选按钮的值都是一个部门的Id
[HttpPost]
修饰的操作,模型绑定器通过尝试将复杂对象的参数名称或属性与Post数据匹配,将发布的数据绑定到方法的参数(或多个参数)。因此,当用户选择某个单选按钮时,其值(取自RadioButtonToll指定的部门Id
)被分配给公司。SelectedDepartment
属性
扩展模型绑定的编辑是受@Jaquez的启发,试图提供一个更完整的描述,当我后来比较这两者时(在OP选择这个作为答案之后),似乎
@using (Html.BeginForm())
{
foreach (var department in Model.Departments)
{
@Html.RadioButtonFor(m => m.SelectedDepartment, department.Id, (department.IsSelected.HasValue && department.IsSelected.Value) ? new (@checked = "checked")} : null
@department.Name
}
<input type="submit" value="Submit" />[Resulting View][1]
[HttpPost]
public string Index(Company company)
{
if(string.IsNullOrEmpty(company.SelectedDepartment)
{
return "You selected nothing";
}
else
{
return "You selected department id: " + company.SelectedDepartment;
}
public class Company
{
public int CompanyId {get; set;}
public string SelectedDepartment {get; set;}
public List<Department> DepartmentsList {get; set;}
}
public class Department
{
public int DepartmentId {get; set;}
public string DepartmentName {get; set;}
}
@model CompanyNamespace.Company
@using(Html.BeginForm())
{
@Html.HiddenFor(model => model.CompanyId)
foreach (Department department in Model.DepartmentsList)
{
@Html.LabelFor(model => modelItem.department)
@Html.RadioButtonFor(model => modelItem.SelectedDepartment, department.DepartmentName)
}
<input type="submit" value="Submit" />
}
SampleDBContext db = new SampleDBContext();
[HttpGet]
public ActionResult Index()
{
Company company = new Company();
company.SelectedDepartment = null;
company.DepartmentList = db.Departments.ToList();
return View("Index", company);
}
[HttpPost]
public ActionResult Index(Company company)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Companies.Add(company);
db.SaveChanges();
return RedirectToAction("Index")
}
+-----------+
| Companies |
+-----------+
+-----------------+--------------------------------+
| CompanyId (Int) | SelectedDepartment (VarChar20) |
+-----------------+--------------------------------+
| 1 | Clothing Department |
| 2 | Electronics Department |
| 3 | Furniture Department |
+-----------------+--------------------------------+
+-------------+
| Departments |
+-------------+
+--------------------+----------------------------+
| DepartmentId (Int) | DepartmentName (VarChar20) |
+--------------------+----------------------------+
| 1 | Clothing Department |
| 2 | Electronics Department |
| 3 | Furniture Department |
| 4 | Hardware Department |
+--------------------+----------------------------+