【发布时间】: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 < Model.Preferences.Count; i++) { @Html.RadioButtonFor(m => m.Preferences[i].Vote, 1) @Html.RadioButtonFor(m => m.Preferences[i].Vote, 1) // plus other 3 }这一切都会自动完成 -
啊,我明白了,这很有道理,你对我帮助很大。
-
我只是举了一个例子,但是如果你想要一个显示你需要使用的实际代码的答案,你需要展示你的模型(这大约是你当前使用的代码的 1/10)
-
按要求添加的模型
标签: asp.net asp.net-mvc radio-button