填充数据库中的下拉列表并保存到数据库

时间:2014-10-30 02:12:31

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

我有两个表,位置和作业

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

我的创建视图:

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,在我之前的项目中,我只是创建或显示,我从来没有遇到过这样的情况。

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

在我的创建视图中,我不知道我应该使用哪个模型,视图模型&#34; CreateJobViewModel&#34;或者&#34;工作&#34;实体?

@model foo.CreateJobViewModel

@model foo.Job

如何链接两个模型???

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

你在考虑这个错误。为什么你有一个Job视图模型和一个Job业务对象?

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

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

有几种方法可以做到这一点,在控制器中手动完成,在业务对象的构造函数中执行此操作,或使用自动播放器。

我的首选是为业务对象创建一个新的构造函数,该构造函数接受一个视图模型,并将属性复制到我需要的东西上(我也是从模型到视图模型)。

答案 2 :(得分:0)

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

您可以使用自动映射器在实体之间进行映射。