【问题标题】:MVC, Saving Data into 2 or more Related models from a single Form / View .?MVC,将数据从单个表单/视图保存到 2 个或多个相关模型中。?
【发布时间】:2014-03-24 10:46:24
【问题描述】:

我的模型: (i) 用于交易

public class Transaction
{
    [Key]
    public int TransactionId { get; set; }

    public DateTime OnWardDate { get; set; }

    public DateTime ReturnDate { get; set; }

    public virtual UserProfile User { get; set; }


}

(ii) 对于用户

public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public string UserName { get; set; }

    private UserDetails _details = new UserDetails();
    public virtual UserDetails details
    {
        get { return _details; }
    }
}

(ii) 用户详情

 public class UserDetails
{
    [Key]
    public int DetailsId { get; set; }

    public string DLNum { get; set; }

}

我的创建交易控制器:

    // GET: /Transaction/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Transaction/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Transaction transaction)
    {
        if (ModelState.IsValid)
        {
            db.Transactions.Add(transaction);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(transaction);
    }

我对创建交易的看法:

 <div class="editor-label">
        @Html.LabelFor(model => model.OnWardDate)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.OnWardDate)
        @Html.ValidationMessageFor(model => model.OnWardDate)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.User.details.DLNum)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.User.details.DLNum)
        @Html.ValidationMessageFor(model => model.User.details.DLNum)
    </div>

当我提交表单时... model.OnWardDate 正在保存但 model.User.details.DLNum 没有保存
我看过 ViewModel。这是唯一的选择吗? 提前致谢。

【问题讨论】:

    标签: c# asp.net-mvc-4 model controllers


    【解决方案1】:

    在您的情况下,我认为这是因为您的设置器对于 UserDetails 是私有的:

    public virtual UserDetails details
    {
        get { return _details; }
    }
    

    如果您基于这些模型创建表,因此无法修改它们,我确实建议您制作一个视图模型,使用该模型发布,然后相应地创建/更新数据库条目。

    【讨论】:

    • 是的.. 我把它改成了.. public virtual UserDetails details {get; set;} 它的工作 :) 谢谢。
    【解决方案2】:
    1. 主要问题是 Entity Framework 需要 getter 和 setter 来获取 POCO 属性,而您的类 UserDetails 只为 details 属性定义了 getter。

    你的模型可能是:

    public class Transaction
    {
        [Key]
        public int TransactionId { get; set; }
    
        public DateTime OnWardDate { get; set; }
    
        public DateTime ReturnDate { get; set; }
    
        public virtual UserProfile User { get; set; }
    
    }
    
    public class UserProfile
    {
        [Key]
        public int UserId { get; set; }
    
        public string UserName { get; set; }
    
        public virtual UserDetails Details { get; set; }
    }
    public class UserDetails
    {
        [Key]
        public int DetailsId { get; set; }
    
        public string DLNum { get; set; }
    }
    

    2。我建议使用在 Controller 中实例化模型并将其传递给视图的模式,如下所示:

        public ActionResult Create()
        {
            var transaction = new Transaction
            {
                User = new UserProfile
                {
                    Details = new UserDetails()
                }
            };
            return View(transaction);
        }
    

    这可确保您的模型正确构建,并允许您在呈现视图之前初始化任何属性。您通常可以摆脱捷径,恕我直言,最好是明确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2022-08-04
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多