#asp.net #asp.net-mvc #radio-button
#asp.net #asp.net-mvc #переключатель
Вопрос:
У меня есть список, в котором каждый элемент списка содержит элемент управления звездным рейтингом, который позволяет пользователю устанавливать свои предпочтения для этого элемента. Элемент управления рейтингом — это, по сути, всего 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() amp;amp; 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; }
}
Комментарии:
1. Вся цель переключателей заключается в том, что вы можете выбрать только один для группы (и все ваши переключатели принадлежат к одной группе с именем
vote
).2. В любом случае весь этот код совершенно не нужен. Все, что вам нужно для
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 }
, и все это будет сделано автоматически3. Ах, я вижу, в этом есть смысл, вы мне очень помогли.
4. Я только что привел пример, но вам нужно показать свои модели, если вы хотите получить ответ, показывающий фактический код, который вам нужно использовать (который будет составлять примерно 1/10 от кода, который вы используете в настоящее время)
5. Модели добавлены по запросу
Ответ №1:
Причина, по которой выбран только последний переключатель, заключается в том, что все ваши переключатели имеют одинаковую name
(группу), и вы можете выбрать только один переключатель из группы.
На 1-й итерации вашего цикла для этого value="1"
выбран переключатель с Preference
. На 2-й итерации выбран переключатель с value="3"
, но поскольку может быть выбран только один переключатель, checked
атрибут удаляется из предыдущего. Процесс продолжается для каждой итерации, и выбирается только переключатель, соответствующий последнему Preference
.
Чтобы решить эту проблему, вам нужно присвоить каждой «группировке» отдельный name
атрибут, чтобы 5 переключателей для 1-го Preference
имели (скажем) name="vote1"
, а для 2-го (скажем) name="vote2"
и т.д.
Однако ни один из ваших javascript не нужен, если вы сначала просто правильно сгенерируете представление путем привязки к вашей модели, и в вашем случае вы должны использовать [view model] [1] (мне бы не хотелось видеть скрипты, которые вы должны использовать, чтобы преобразовать все это обратно в свою модель при публикации значений).