Я новичок в ASP.MVC4, и перед вами стоит задача передать объект из представления в контроллер: позвольте мне объяснить мою проблему с начала: Мой класс, который используется, например: UserAndRolesModel
public class UserAndRolesModel
{
public user User { get; set; }
public IEnumerable<UserAndRoles> AsignedRoles { get; set; }
}
Как вы можете видеть класс UserAndRolesModel сохраняется из 2 объектов: user и Enumerable
public class user
{
[HiddenInput(DisplayValue=false)]
public virtual int user_id { get; set; }
[Required(ErrorMessage = "Please provide name")]
[Display(Name = "Name")]
public virtual string user_name { get; set; }
[Display(Name = "Is active?")]
public virtual bool user_active { get; set; }
}
public class UserAndRoles
{
public string RoleName { get; set; }
public bool IsAssigned { get; set; }
}
Мое действие контроллера простое, он назначает пользователя UserWithRoles.User и создает tempList с объектами UserAndRoles.
public ActionResult Edit(int userid=0)
{
//object which will be passed to View
UserAndRolesModel UserWithRoles = new UserAndRolesModel();
//user
UserWithRoles.User = repoUsers.Users.FirstOrDefault(x => x.user_id == userid);
//roles
IList<UserAndRoles> tempList = new List<UserAndRoles>();
UserAndRoles temp1 = new UserAndRoles();
temp1.RoleName="Admin";
temp1.IsAssigned=true;
UserAndRoles temp2 = new UserAndRoles();
temp2.RoleName="User";
temp2.IsAssigned=false;
tempList.Add(temp1);
tempList.Add(temp2);
//assign tempList to model
UserWithRoles.AsignedRoles = tempList;
return View(UserWithRoles);
)
На этом этапе я успешно перехожу к View:
UserWithRoles.User.user_id=1;
UserWithRoles.User.user_name="UserName1";
UserWithRoles.User.user_active=true;
UserWithRoles.AsignedRoles[1].RoleName = "Admin";
UserWithRoles.AsignedRoles[1].IsAssigned = true ;
UserWithRoles.AsignedRoles[2].RoleName = "User";
UserWithRoles.AsignedRoles[2].IsAssigned = false;
Я могу отобразить выше Просмотр правильно:
@model Models.UserAndRolesModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<div class="editor-field">
@Html.EditorFor(model => model.User.user_id)
@Html.ValidationMessageFor(model => model.User.user_id)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.User.user_name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.User.user_name)
@Html.ValidationMessageFor(model => model.User.user_name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.User.user_active)
</div>
<div class="editor-field">
@Html.CheckBoxFor(model => model.User.user_active)
@Html.ValidationMessageFor(model => model.User.user_active)
</div>
<br /> ROLES below is piece of code which makes me cry<br />
@foreach (var item in Model.AsignedRoles)
{
<div class="editor-field">
<div class="editor-field">
@Html.LabelFor(model => item.RoleName)
@Html.CheckBoxFor(model => item.IsAssigned)
</div>
</div>
}
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
Когда я нажимаю "Отправить", все данные, касающиеся пользователя, были переданы правильно, но IEnumerable AsignedRoles всегда имеет значение null. Вот мой метод контроллера на пост:
[HttpPost]
public ActionResult Edit(UserAndRolesModel UserWithRoles)
{
if (ModelState.IsValid)
{
if (UserWithRoles.AsignedRoles==null)
Console.WriteLine("I am still crying");
else
Console.WriteLine("Got it!");
}
return View(UserWithRoles);
}
В представлении я попытался использовать другие циклы, например:
@for (int i = 0; i < Model.AsignedRoles.Count(); i++)
{
<div class="editor-field">
@Html.LabelFor(model => item[i].IsAssigned)
@Html.CheckBoxFor(model => item[i].IsAssigned)
</div>
}
Но выше также не проходит IEnumerable. Может ли кто-нибудь помочь мне решить эту проблему? Как я могу перейти к контроллеру UserAndRolesModel, который содержит IEnumerable? Я буду очень благодарен. Спасибо за помощь!
Вам нужен цикл for
, но тот, который вы попробовали, ссылался на item[i]
, но item[i]
больше не существует. Попробуйте это, обратите внимание, что я также добавил HiddenFor
для RoleName
иначе это не будет передано обратно:
@for (int i = 0; i < Model.AsignedRoles.Count(); i++)
{
<div class="editor-field">
@Html.LabelFor(model => model.AssignedRoles[i].IsAssigned)
@Html.CheckBoxFor(model => model.AssignedRoles[i].IsAssigned)
@Html.HiddenFor(model => model.AssignedRoles[i].RoleName)
</div>
}
IList
вместоIEnumerable
? Кроме того, потому что я не могу не комментировать это;AsignedRoles
отсутствует s, аUserWithRoles
не соответствует вашему соглашению о lowerCasedVariableNames.