【问题标题】:Populate dropdown from database and saving to database从数据库填充下拉列表并保存到数据库
【发布时间】:2014-12-25 22:59:14
【问题描述】:

我有两张表,Location 和 Job

当我想创建新工作时,我可以从位置表中填充的下拉列表中选择位置。

我的创建视图:

public ActionResult Create(CreateJobViewModel model)
{
    model.Locations = repository.GetAllLocations()
            .Select(x => new SelectListItem { Text = x.State, Value = x.LocationId.ToString() })
            .ToList();

    return View(model);
}

和我的视图模型:

public class CreateJobViewModel
{
    public Job Job { get; set; }

    public IList<SelectListItem> Locations { get; set; }
    public int SelectLocationId { get; set; }
}

这一切都很好,但是我如何从下拉框中获取选定的值,然后将该值保存在 Job 表的外键字段中?

我的帖子操作如下所示:

 [HttpPost]
 [Authorize(Roles = "Employer")]
 [ValidateAntiForgeryToken]
 public ActionResult Create(Job job)
 {
     repository.AddJob(job);
     return RedirectToAction("Create");
 }

post 动作使用 Job 实体,get 动作使用 CreateJobViewModel,在我之前的项目中,我只创建或显示,我从未遇到过这样的情况。

我正在考虑在视图之间传递模型???

在我的创建视图中,我不知道应该使用哪个模型,视图模型“CreateJobViewModel”还是“Job”实体?

@model foo.CreateJobViewModel

@model foo.Job

如何链接这两个模型???

【问题讨论】:

    标签: asp.net-mvc entity-framework model-view-controller model


    【解决方案1】:

    这是我的一些代码,类似于你的问题,你可以根据你的要求修改它。希望对您有所帮助。

    控制器:

    public ActionResult Create()
        {
            string selected = (from cat in dc.Category
                               join sub in dc.SubCategory on cat.Id equals sub.SubCategoryId
                               select cat.Name).First();
    
            ViewBag.Category = new SelectList(dc.Category, "Id", "Name", selected);
    
            var model = new SubCategory();
    
            return View(model);
        }
    

    查看:

     <div> Category:</div>              
         <div>
             @Html.DropDownListFor(model => model.CategoryId, (IEnumerable<SelectListItem>)ViewBag.Category,
                   new { @class = "form-control" })
         </div>
    

    【讨论】:

      【解决方案2】:

      您应该在创建中使用视图模型,然后使用自定义映射逻辑来制作 Job 实体并发送到您的业务或数据层。

      您可以使用 Auto mapper 在实体之间进行映射。

      【讨论】:

        【解决方案3】:

        你想错了。为什么会有 Job 视图模型和 Job 业务对象?

        您的视图应该只知道视图模型,您的控制器应该(如何进行此设置)知道视图模型和业务模型,而存储库只知道业务模型。

        让 Post 操作返回一个 Job View Model。然后将 View Model 转换为控制器中的模型并传递给存储库。

        您可以通过多种方式执行此操作,在控制器中手动执行此操作,在业务对象的构造函数中执行此操作,或使用自动映射器。

        我的偏好是为接受视图模型的业务对象创建一个新的构造函数,并复制我需要的属性(我也从模型到视图模型这样做)。

        【讨论】:

        • 你能举个例子吗?
        猜你喜欢
        • 2014-12-25
        • 1970-01-01
        • 2011-11-09
        • 2018-10-03
        • 2016-01-09
        • 1970-01-01
        相关资源
        最近更新 更多