0

我已经能够创建视图模型这样的视图模型(请忽略它包括另一视图模型,之后我解决我目前的问题:)这将是固定的):ListBoxFor没有完全更新在提交

public class UserViewModel 
{ 
    #region Variables 
    private SecUserViewModel user; 
    private string[] assignedRolesIds; 
    private List<SecRoleViewModel> availableRoles; 
    #endregion 

    #region Properties 
    public SecUserViewModel User 
    { 
     get { return this.user; } 
     set { this.user = value; } 

    } 
    public string Guid 
    { 
     get { return this.user.Guid.ToString(); } 
     set { this.user.Guid = value; } 
    } 

    public string UserName 
    { 
     get { return this.user.UserName; } 
     set { this.user.UserName = value; } 
    } 

    public string Email 
    { 
     get { return this.user.Email; } 
     set { this.user.Email = value; } 
    } 

    public byte[] AuthDigest 
    { 
     get { return this.user.AuthDigest; } 
     set { this.user.AuthDigest = value; } 
    } 

    public bool IsUsingTempPasswd 
    { 
     get { return this.user.IsUsingTempPasswd; } 
     set { this.user.IsUsingTempPasswd = value; } 
    } 
    public DateTime? LastLogin 
    { 
     get { return this.user.LastLogin; } 
     set { this.user.LastLogin = value; } 
    } 

    public DateTime? PasswordChanged 
    { 
     get { return this.user.PasswordChanged; } 
     set { this.user.PasswordChanged = value; } 
    } 
    public string[] AssignedRolesIds 
    { 
     get { return this.assignedRolesIds; } 
     set { this.assignedRolesIds = value; } 

    } 
    public List<SecRoleViewModel> AvailableRoles 
    { 
     get { return this.availableRoles; } 
     set { this.availableRoles = value; } 

    } 
    #endregion 

    #region Constructor 

    public UserViewModel() 
    { 
     User = new SecUserViewModel(); 
     AssignedRolesIds = null; 
     AvailableRoles = new List<SecRoleViewModel>(0); 
    } 

    public UserViewModel(SecUserViewModel secUser, List<SecRoleViewModel> roleList, List<SecRoleViewModel> availableList) 
    { 
     User = secUser; 
     AssignedRolesIds = roleList.Select(r => r.Role.Guid.ToString()).ToArray(); 
     AvailableRoles = availableList; 
    } 

    #endregion 
} 

我的控制器有一个编辑操作。在“GET”上,我传递viewmodel,并且正确显示它,包括多选列表和预选值。但是当我“发布”“编辑”时,传回的UserViewModel具有“AssignedRolesIds”和“AvailableRoles”为空,尽管其他所有内容都已填充。当我检查FormCollection对象时,存在“AssignedRolesIds”作为关键字。

我的看法是这样的:

@model DocuLive.ViewModels.UserViewModel 

@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_AdminPage.cshtml"; 
} 

<h2>Edit</h2> 
<div class="error-message">@TempData["Fail"]</div> 
<div class="success-message">@TempData["Success"]</div> 
@using (Html.BeginForm("Edit", "User", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>SecUser</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.User.Guid) 
     </div> 
     <div class="editor-field"> 
      @Html.DisplayFor(model => model.User.Guid) 
      @Html.HiddenFor(model => model.User.Guid) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.User.UserName) 
     </div> 
     <div class="editor-field"> 
      @Html.DisplayFor(model => model.User.UserName) 
      @Html.HiddenFor(model => model.User.UserName) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.User.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.User.Email) 
      @Html.ValidationMessageFor(model => model.User.Email) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.User.IsUsingTempPasswd) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.User.IsUsingTempPasswd) 
      @Html.ValidationMessageFor(model => model.User.IsUsingTempPasswd) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.User.LastLogin) 
     </div> 
     <div class="editor-field"> 
      @Html.DisplayFor(model => model.User.LastLogin) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.User.PasswordChanged) 
     </div> 
     <div class="editor-field"> 
      @Html.DisplayFor(model => model.User.PasswordChanged) 
     </div> 
     <div class="hidden-field"> 
      @Html.HiddenFor(model => model.User.AuthDigest) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.AssignedRolesIds) 
     </div> 
     <div class="editor-field"> 
      @Html.ListBoxFor(x => x.AssignedRolesIds, new MultiSelectList(Model.AvailableRoles, "Guid", "RoleName"), new { Multiple = "multiple", @class = "multi-select-list" }) 
     </div> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Users") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

任何人都可以提出建议,为什么只涉及到ListBoxFor值不传递回(有一个空值)?

在此先感谢

+0

这个senario你应该使用Html.DropDownListFor(...)。如果你想知道我可以添加答案,例如。 –

+0

我需要的角色是“多项选择” - 如果DropDownListFor将做的伎俩,我会很乐意使用它,所以我会感激你的解决方案四我的问题... – Erchi

回答

0

看来这个问题是结合字符串数组值值复杂对象的字符串ID(在我的案件的角色) - 但我终于想出了变通的办法。关键是有方法的此签名:

[HttpPost] 
public ActionResult Edit(UserViewModel user, string [] assignedRolesIds) 

然后你有这样的观点:

@Html.ListBox("AssignedRolesIds",new MultiSelectList(Model.AvailableRoles, "Guid", "RoleName"),new { Multiple = "multiple", @class = "multi-select-list"}) 

有了这个解决方案,你不得不重新分配“assignedRolesIds”回“AssignedRolesIds”属性在UserViewModel上,但这只是两行(包括检查数组不是emppty或null)。