【问题标题】:Only last radio button control in list being set as checked只有列表中的最后一个单选按钮控件设置为选中
【发布时间】:2017-03-05 16:24:48
【问题描述】:

我有一个列表,列表中的每个元素都包含一个星级控件,允许用户设置他们对该元素的偏好。评级控制基本上只有 5 个单选按钮。我遇到的问题是,当我检索用户之前所做的首选项时,只显示最后一个首选项,之前所有元素的单选按钮都未选中。

这是它的外观,最后一个元素显示 4 星,但它也应该为第一个元素显示一个星,为第二个元素显示三个星:

这是视图的代码:

@foreach (var item in Model.TaskEntities)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Code)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AspNetUser.Forename)
            @Html.DisplayFor(modelItem => item.AspNetUser.Surname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AspNetUser.Email)
        </td>
        <td>
            @{
                var list = new TaskEntityAndPreferencesModel(item, Model.Preferences);
            }
            @Html.Partial("_Rating", list)
        </td>
        <td>
            @*@Html.ActionLink("Edit", "Edit", new { id = item.CourseID }) |
                @Html.ActionLink("Details", "Details", new { id = item.CourseID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.CourseID })*@
        </td>
    </tr>
<tr>

    <td colspan="5">
        @Html.DisplayFor(modelItem => item.Description)
    </td>
</tr>
}

这是评级控制(_Rating)的代码:

@using Microsoft.AspNet.Identity
@model AssignerWebTool.Models.TaskEntityAndPreferencesModel

@{
var checkedOne = false;
var checkedTwo = false;
var checkedThree = false;
var checkedFour = false;
var checkedFive = false;


foreach (var preference in Model.Preferences)
{
    if (preference.UserID == User.Identity.GetUserId() && preference.TaskEntityID == Model.Task.ID)
    {
        if (preference.Rating == 1)
        {
            checkedOne = true;
        }
        else if (preference.Rating == 2)
        {
            checkedTwo = true;
        }
        else if (preference.Rating == 3)
        {
            checkedThree = true;
        }
        else if (preference.Rating == 4)
        {
            checkedFour = true;
        }
        else if (preference.Rating == 5)
        {
            checkedFive = true;
        }
    }
}
}
<div class="ratting-item" data-pid="@Model.Task.ID">
@{
    if (checkedOne)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="1"/>
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="1" />
    }
    if (checkedTwo)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="2" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="2" />
    }
    if (checkedThree)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="3" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="3" />
    }
    if (checkedFour)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="4" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="4" />
    }
    if (checkedFive)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="5" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="5" />
    }
}

</div>
<span class="result"></span>

我不确定为什么这仅适用于最后一个元素而不是任何以前的元素,因此非常感谢任何帮助。

编辑:

型号:

public class TaskEntityAndPreferencesModel
{

    public TaskEntity Task { get; set; }
    public IEnumerable<UserTaskEntityPreference> Preferences { get; set; }

    public TaskEntityAndPreferencesModel(TaskEntity task, IEnumerable<UserTaskEntityPreference> preferences)
    {
        Task = task;
        Preferences = preferences;
    }
}


public partial class TaskEntity
{
    public TaskEntity()
    {
        this.UserAssignedToTaskEntities = new HashSet<UserAssignedToTaskEntity>();
        this.UsersUserPreferences = new HashSet<UsersUserPreference>();
        this.UserTaskEntityPreferences = new HashSet<UserTaskEntityPreference>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
    public string RelatedSubjects { get; set; }
    public int MaxNumberOfUsers { get; set; }
    public int TaskGroupID { get; set; }
    public string SupervisorID { get; set; }

    public virtual Task_Group Task_Group { get; set; }
    public virtual ICollection<UserAssignedToTaskEntity> UserAssignedToTaskEntities { get; set; }
    public virtual ICollection<UsersUserPreference> UsersUserPreferences { get; set; }
    public virtual ICollection<UserTaskEntityPreference> UserTaskEntityPreferences { get; set; }
    public virtual AspNetUser AspNetUser { get; set; }
}


public partial class UserTaskEntityPreference
{
    public string UserID { get; set; }
    public int TaskEntityID { get; set; }
    public int Rating { get; set; }
    public int ID { get; set; }

    public virtual AspNetUser AspNetUser { get; set; }
    public virtual TaskEntity TaskEntity { get; set; }
}

【问题讨论】:

  • 单选按钮的全部目的是您只能为组选择一个(并且所有单选按钮都属于一个名为vote的组)。
  • 无论如何,所有这些代码都是完全没有必要的。您需要for 循环或自定义EditorTemplate - 例如for(int i = 0; i &lt; Model.Preferences.Count; i++) { @Html.RadioButtonFor(m =&gt; m.Preferences[i].Vote, 1) @Html.RadioButtonFor(m =&gt; m.Preferences[i].Vote, 1) // plus other 3 } 这一切都会自动完成
  • 啊,我明白了,这很有道理,你对我帮助很大。
  • 我只是举了一个例子,但是如果你想要一个显示你需要使用的实际代码的答案,你需要展示你的模型(这大约是你当前使用的代码的 1/10)
  • 按要求添加的模型

标签: asp.net asp.net-mvc radio-button


【解决方案1】:

之所以只选择最后一个单选按钮,是因为您所有的单选按钮都具有相同的name(组),并且您只能从组中选择一个单选按钮。

在循环的第一次迭代中,为 Preference 选择了带有value="1" 的单选按钮。在第 2 次迭代中,带有value="3" 的单选按钮被选中,但由于只能选择一个单选按钮,因此从前一个中删除了 checked 属性。每次迭代都会继续该过程,并且仅选择与最后一个 Preference 匹配的单选按钮。

要解决这个问题,您需要为每个“分组”赋予不同的 name 属性,这样第一个 Preference 的 5 个单选按钮将具有(比如)name="vote1" 和第二个(比如)@987654330 @等

但是,如果您只是通过绑定到您的模型首先正确生成视图,并且在您的情况下您应该使用 [视图模型][1](我不想看到发布值时必须使用的脚本将其全部转换回模型)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2015-05-06
    • 2012-06-18
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多