【问题标题】:Error while binding ViewModel in MVC4?在 MVC4 中绑定 ViewModel 时出错?
【发布时间】:2015-03-04 07:52:33
【问题描述】:

如何在 MVC4 中更新视图模型?

控制器

  [HttpPost]
    public ActionResult Create(userViewModel model)
    {           
        var menuIds = string.Join(",", model.MenuIds);
        model.User.MENU = menuIds;
        TryUpdateModel(model);
        if (ModelState.IsValid)
        {               
            _db.Entry(model.User).State = EntityState.Modified;
            _db.SaveChanges();
        }
        return RedirectToAction("Create");
    }

每当我检查模型状态时,我都会收到User.Menu as null。但menuIds 包含该值。

查看

  @using MvcSIMS.Models.ViewModels;
  @model userViewModel

   <div class="form-group">
        @Html.LabelFor(model=>model.User.USERNAME, new { @class = "col-sm-2 control-label " })
        <div class="col-sm-6 ">

            @Html.TextBoxFor(model=>model.User.USERNAME, new { @class = "form-control" })
            @Html.ValidationMessageFor(model=>model.User.USERNAME)
        </div>
    </div> 
    <div class="form-group">
        @Html.Label("Menu", new { @class = "col-sm-2 control-label " })
        <div class="col-sm-10 ">
             @*@Html.ListBox("menuIds",Model.MenuList,new { @class = "chosen-select",multiple="multiple",style="width:350px"})*@
            @Html.ListBoxFor(model=>model.MenuIds,Model.MenuList,new {id="menuListBox", @class = "chosen-select",multiple="multiple",
            style="width:350px"})
            @Html.ValidationMessageFor(model =>model.MenuIds)
        </div>

    </div>
    <div class="col-lg-12">
        <button type="submit" id="btnSubmit" class="btn btn-default">
            Submit
        </button>
    </div>

视图模型

    public User User { get; set; }

    [DataType(DataType.Password)]
    [Required(ErrorMessage = "CONFIRM PASSWORD is required")]
    [Display(Name="CONFIRM PASSWORD")]      
    [Compare("PASSWORD",ErrorMessage="Password didnot match")]
    public string ComparePassword { get; set; }

    public IEnumerable<Designation> DesignationList { get; set; }
    public SelectList MenuList { get; set; }

    [Required(ErrorMessage="Select some menu items")]
    public List<string> MenuIds { get; set; }

我认为更新模型时出了点问题。

型号

  public partial class User
{

    public int ID { get; set; }

    [Required(ErrorMessage="Select Designation")]
    public Nullable<int> DESIGNATIONID { get; set; }

    [Required(ErrorMessage="UserName is required")] 
    [Remote("IsUserNameAvailable","User",ErrorMessage="UserName already exists.")]
    [Display(Name="USERNAME")]
    public string USERNAME { get; set; }

    [Required(ErrorMessage="Password is required")]
    [DataType(DataType.Password)]
    public string PASSWORD { get; set; }

    public string ADDRESS { get; set; }
    public string PHONE { get; set; }

    [Required(ErrorMessage="Select Menu list")]
    public string MENU { get; set; }

    public Nullable<int> ROLE { get; set; }
    public Nullable<bool> STATUS { get; set; }

    public virtual Designation Designation { get; set; }
    public virtual ICollection<Mobilization> Mobilizations { get; set; }
}

【问题讨论】:

  • 您是否查看强类型?
  • 更新了问题。
  • 请同时提供您的 ViewModel

标签: c# asp.net-mvc-4 data-binding viewmodel


【解决方案1】:

你可以试试这样吗?

    [HttpPost]
    public ActionResult Create(userViewModel model)
    {           
        var menuIds = string.Join(",", model.MenuIds);
        var dbModel = new userViewModel();
        dbModel.User = new User();
        dbModel.User.MENU = menuIds;

        TryUpdateModel(dbModel);
        if (ModelState.IsValid)
        {               
            _db.Entry(dbModel.User).State = EntityState.Modified;
            _db.SaveChanges();
        }
        return RedirectToAction("Create");
    }

【讨论】:

  • 如果在创建像var dbModel = new userViewModel()这样的实例,那么值将如何绑定到dbModel中
  • dbModel.User.MENU = menuIds - 你没注意到这一行吗?
  • 如果你期望 UserName 值也行不通。
【解决方案2】:

首先,您需要确保model 包含MenuIds 的值。 String.Join连接字符串数组的指定元素,在每个元素之间使用指定的分隔符。如果您的 model.MenuIds 不是数组,则将其转换为数组。还要检查model.MenuIds 中是否有内部对象。如果有内部对象,则在加入期间指定。

var menuIds = String.Join(",", model.MenuIds, 0, model.MenuIds.length );

或者

var menuIds = String.Join(",", model.MenuIds.toArray(), 0, model.MenuIds.length );

还要确保 - menuIds 不超过 User.MENU 的最大长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多