我有两个表,位置和作业
当我想创建一个新工作时,我可以从下拉列表中选择位置,该列表是从位置表中填充的。
我的创建视图:
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
如何链接两个模型???
答案 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实体并发送到您的业务或数据层。
您可以使用自动映射器在实体之间进行映射。