私はasp.net mvc 3.0を開発しており、以下のようにビューで複雑なモデルを使用しています:
@model StoresAndMalls.DataModel.Entities.User
........
<div class="editor-label">
@Html.LabelFor(model => model.EmailAddress)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.EmailAddress)
@Html.ValidationMessageFor(model => model.EmailAddress)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Status)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Status)
@Html.ValidationMessageFor(model => model.Status)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Role)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Role)
@Html.ValidationMessageFor(model => model.Role)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserRules)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserRules,"UserRules", new { AllRules = ViewBag.AllRules})
</div>
ここに私のモデルがあります:
public partial class User
{
......
public virtual ICollection<UserRule> UserRules { get; set; }
public virtual Role Role { get; set; }
}
public class UserRule
{
.....
[ForeignKey("UserId")]
public virtual User User { get; set; }
[ForeignKey("RuleId")]
public virtual Rule Rule { get; set; }
}
public partial class Role
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
最近のプロジェクトでは、複雑なモデルを使用してビューを作成したときに、Role などのフォーム要素に User というプレフィックスが付いていましたが、これは「User.Role」のようなものがあったことを意味しますが、現在はそうではなく、エディター テンプレートを使用しているにもかかわらずUser クラスの「UserRules」プロパティについても同様に機能せず、「User」接頭辞がありません。
Role と UserRule のエディター ビューは次のとおりです。
@model IEnumerable<StoresAndMalls.DataModel.Entities.UserRule>
@{
var allrules = (ViewData["AllRules"] as List<StoresAndMalls.DataModel.Entities.Rule>);
int c = 0;
}
@
foreach (var item in allrules)
{
@item.Description
@Html.CheckBox(Model.Any(x => x.RuleId == item.Id))
c++;
<br />
}
-----------
@model StoresAndMalls.DataModel.Entities.Role
@{
var selecetList = (ViewData["Roles"] as List<StoresAndMalls.DataModel.Entities.Role>).
ConvertAll(x => new SelectListItem { Value = x.Id.ToString(), Text = x.Name, Selected = x.Id == Model.Id });
}
@Html.DropDownListFor(x => x, selecetList)
-------------
「UserRule」については、試しました
@model StoresAndMalls.DataModel.Entities.UserRule
しかし、それはスローします:
The model item passed into the dictionary is of type 'System.Collections.Generic.HashSet`1[DataModel.Entities.UserRule]', but this dictionary requires a model item of type 'DataModel.Entities.UserRule'.
編集:
public ActionResult UpdateManager(Guid id)
{
ViewBag.Roles = unitofwork.RoleRepository.Get();
ViewBag.AllRules = unitofwork.UserRepository.GetByID(id).UserRules;
var model = unitofwork.UserRepository.GetByID(id);
return View(model);
}