首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC RadioButtonFor混淆

MVC RadioButtonFor混淆
EN

Stack Overflow用户
提问于 2016-08-11 23:06:16
回答 3查看 1.6K关注 0票数 0

我在看一个教程视频,https://www.youtube.com/watch?v=04RY04uKq2s,我只是不明白RadioButtonFor发生了什么。

基本上,这个家伙创建了一个公司类:

代码语言:javascript
复制
public class Company
{

    public string SelectedDepartment {get; set;}


    public List<Department> Departments
    {
        get
        {
            SampleDBContext db = new SampleDBContext();
            return db.Departments.ToList();
        }
    }
}

`

好吧,挺直接的。他在这里使用EntityFramework,它生成了SampleDBContext类。

然后他有一个非常简单的索引ActionMethod:

代码语言:javascript
复制
[HttpGet]
public ActionResult Index()
{
    Company company = new Company();
    return View();
}

此HttpGet的强类型视图。

代码语言:javascript
复制
@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 ActionMethod:

代码语言:javascript
复制
[HttpPost]
public string Index(Company company)
{
    if(string.IsNullOrEmpty(company.SelectedDepartment)
    {
        return "You selected nothing";
    }
    else
    {
        return "You selected department id: " + company.SelectedDepartment;
    }

好吧,呼。数据库有3个列,Id、Name和IsSelected (位类型)。

所以,1.HR.1 2..Payroll..NULL 3..IT..NULL

很长的邮件?我真希望不是这样。每一块都是非常笔直的。

现在我的问题是:

(1) RadioButtonFor()如何使用(m=>m.SelectedDepartment)?为什么HttpPost方法检查它的字符串是空的还是空的?

(2)当你在方法中打印company.SelectedDepartment的值时,你得到了ID。这个赋值是在哪里进行的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-11 23:40:17

在视图代码中,缺少视图所使用的实际模型的定义。您可以通过添加@model CompanyNamespace.Company来做到这一点。

  1. m => m.SelectedDepartment是一个lambda,它选择模型的属性,您可以签入Post操作来检索用户选择的单选按钮的value。如果用户没有选择任何单选按钮,则该值是null (或者在一般情况下是default(T),在本例中是default(string) = null),因此是Post操作中的if条件。
  2. RadioButtonFor的第二个参数指定每个单选按钮的值。因为在您的示例中它是department.Id,所以每个生成的单选按钮的值都是部门的Id。

至于代码,正如其他人在对您的回答的评论中所指出的那样,我不建议您使用您发布的aproach,可能会转而使用其他来源来学习MVC。IIRC,也有关于asp.net的简单易学教程.

编辑:当您提交表单时,请求被路由到用[HttpPost]修饰的操作,模型绑定器通过尝试将参数名称或复杂对象的属性与Post数据相匹配,将已发布的数据绑定到方法的参数(或参数)。因此,当用户选择某个单选按钮时,它的值(从department.Id中提取,由RadioButtonFor调用指定)分配给company.SelectedDepartment属性。

扩展模型绑定的编辑是受@Jaquez https://stackoverflow.com/a/38907684/4955259的启发,目的是提供一个更完整的描述。后来,当我比较这两者(在OP选择这一答案之后),在我看来,它最终--在很大程度上--作为@Jaquez答案这一部分的重述。我认为提到这一点是公平的。

票数 1
EN

Stack Overflow用户

发布于 2016-08-12 01:26:50

您所共享的代码并不遵循常见的约定,而且实际上根本没有什么意义。

下面是解决示例问题的一种更为传统的方法:

公司模型

代码语言:javascript
复制
public class Company
{
    public int CompanyId {get; set;}
    public string SelectedDepartment {get; set;}
    public List<Department> DepartmentsList {get; set;}
}

部门模型

代码语言:javascript
复制
public class Department
{
    public int DepartmentId {get; set;}
    public string DepartmentName {get; set;}
}

视图

代码语言:javascript
复制
@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" />
}

控制器

代码语言:javascript
复制
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")
}

数据库样本

代码语言:javascript
复制
+-----------+
| 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        |
+--------------------+----------------------------+

回答你的问题..。

"model => modelItem.SelectedDepartment“是lamda表达式。表达式表示“此单选按钮将表示模型的SelectedDepartment字段”。

由于视图中的所有单选按钮都表示模式中相同的SelectedDepartment字段,因此只能同时选择一个单选按钮。

所选单选按钮的值(在本例中为"department.DepartmentName“)将是发送回模型(和数据库)的值。

请注意,我们控件中的http方法不再返回字符串。为了查看对数据的更改,您必须直接查看数据库。

票数 3
EN

Stack Overflow用户

发布于 2016-08-11 23:37:19

需要空或空字符串检查,因为单选按钮的值只有在选中按钮时才会包含在POST中。这对于复选框也是一样的,并且是web标准本身的一部分,而不是MVC。

当MVC框架接受提交的值并使用它实例化(POST)索引方法的参数类型的新实例时,为company.SelectDepartment分配值。这是通过将提交的数据中的属性名称与参数类型的属性名称相匹配来完成的。通过使用带有类型化模型的RadioButtonFor助手方法,您可以确保单选按钮的名称和提交的值的名称符合Index所要求的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38907418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档