在mvc4中使用一个视图进行索引和创建
本文关键字:视图 一个 索引 创建 mvc4 | 更新日期: 2023-09-27 18:16:49
我试图使用一个视图,在其中我显示当前的结果,有能力添加一个新的记录。我看了这篇文章,也是这篇文章,拼凑的东西,我认为应该工作,但它不会保存到数据库。这是我的视图模型:
public class LabIndexViewModel
{
public Lab Lab { get; set; }
public IEnumerable<Lab> Labs { get; set; }
}
在我的控制器中,我在索引中有这个:
public ActionResult Index(int patid = 0, Lab lab = null)
{
ViewBag.Finalize = PatientSubmitted(patid);
ViewBag.DispPatientId = patid;
ViewBag.CheckButtonStatus = ButtonSubmitted(patid);
var labs = db.Labs.Where(l => l.PatientId == patid && l.Active);
LabIndexViewModel model = new LabIndexViewModel();
model.Labs = labs.ToList();
model.Lab = lab;
SetViewBagLists();
return View(model);
}
然后在我的帖子不能保存的地方:
[HttpPost]
public ActionResult Create(LabIndexViewModel labindex)
{
ViewBag.DispPatientId = labindex.Lab.PatientId;
Lab lab = labindex.Lab;
try
{
lab.Active = true;
db.Labs.Add(lab);
db.SaveChanges();
return RedirectToAction("Index", "Lab", new { patid = lab.PatientId });
}
catch
{
ViewBag.Phase = new SelectList(StatusList(), "Text", "Value");
ViewBag.Name = new SelectList(db.LabOptions, "Test", "Value", lab.Name);
return View(lab);
}
}
这是我的部分,我在我的视图中提交数据:
@model PamperWeb.Models.LabIndexViewModel
@using (Html.BeginForm("Create", "Lab")) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Lab</legend>
<tr>
<td>
@Html.DropDownList("Name", String.Empty)
@Html.ValidationMessageFor(model => model.Lab.Name)
</td>
<td>
@Html.EditorFor(model => model.Lab.Value)
@Html.ValidationMessageFor(model => model.Lab.Value)
</td>
<td>
@Html.EditorFor(model => model.Lab.Given)
@Html.ValidationMessageFor(model => model.Lab.Given)
</td>
<td>
@Html.EditorFor(model => model.Lab.TimeGiven)
@Html.ValidationMessageFor(model => model.Lab.TimeGiven)
</td>
<td>
@Html.DropDownList("Phase", String.Empty)
@Html.ValidationMessageFor(model => model.Lab.Phase)
</td>
@Html.HiddenFor(model => model.Lab.PatientId)
<td>
<input type="submit" value="Create" />
</td>
</tr>
</fieldset>
}
有人知道如何使这个工作或有一个好的例子吗?
我并没有真正理解所有的问题,但我看到了一些错误:
1)你的PartialView必须发布一个Lab,所以使它为Lab强类型,因为HTML helper将生成HTML,默认ModelBinder无法处理,无法使用LabIndexViewModel在服务器中构建模型:
@model PamperWeb.Models.Lab
@using (Html.BeginForm("Create", "Lab")) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Lab</legend>
<tr>
<td>
@Html.DropDownList("Name", String.Empty)
@Html.ValidationMessageFor(model => model.Name)
</td>
<td>
@Html.EditorFor(model => model.Value)
@Html.ValidationMessageFor(model => model.Value)
</td>
<td>
@Html.EditorFor(model => model.Given)
@Html.ValidationMessageFor(model => model.Given)
</td>
<td>
@Html.EditorFor(model => model.TimeGiven)
@Html.ValidationMessageFor(model => model.TimeGiven)
</td>
<td>
@Html.DropDownList("Phase", String.Empty)
@Html.ValidationMessageFor(model => model.Phase)
</td>
@Html.HiddenFor(model => model.PatientId)
<td>
<input type="submit" value="Create" />
</td>
</tr>
</fieldset>
}
2)更改控制器Action Create以接收已发布的Lab作为参数:
[HttpPost]
public ActionResult Create(Lab lab)
{
ViewBag.DispPatientId = Lab.PatientId;
try
{
lab.Active = true;
db.Labs.Add(lab);
db.SaveChanges();
return RedirectToAction("Index", "Lab", new { patid = lab.PatientId });
}
catch
{
ViewBag.Phase = new SelectList(StatusList(), "Text", "Value");
ViewBag.Name = new SelectList(db.LabOptions, "Test", "Value", lab.Name);
return View(lab);
}
}
3)使用创建的ViewModel来显示实验室!这就是ViewModel master的目的,在视图中显示复杂的类型!任何其他操作都需要创建自定义ModelBinder,以便在请求中进行交互,并在服务器中构建模型。
希望这对你有帮助!我真的从问题中得到了这个!
在注释的帮助下,我能够找出问题所在。当我将参数添加到html。Beginform不再发送我的url参数与patientid。不知道为什么?我的普通创建视图有这个所以我的隐藏参数获取了这个值。我最终在控制器中设置了这个值,这样表单中的隐藏参数就能够拾取它。下面是解决这个问题的get索引:
public ActionResult Index(int patid = 0, Lab lab = null)
{
ViewBag.Finalize = PatientSubmitted(patid);
ViewBag.DispPatientId = patid;
ViewBag.CheckButtonStatus = ButtonSubmitted(patid);
var labs = db.Labs.Where(l => l.PatientId == patid && l.Active);
LabIndexViewModel model = new LabIndexViewModel();
if (lab == null)
lab = new Lab();
lab.PatientId = patid;
model.Labs = labs.ToList();
model.Lab = lab;
SetViewBagLists();
return View(model);
}
我还发现这篇文章很有帮助,因为我发现我可以指定一个模型发送到局部。