0

我正在尝试使用一个视图来显示能够添加新记录的当前结果。我查看了这篇文章和这篇文章,并拼凑了一些我认为应该可行但不会保存到数据库中的东西。这是我的视图模型:

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>
}

有人对如何进行这项工作有任何想法或有一个很好的例子吗?

4

2 回答 2

1

我并没有真正理解所有问题,但我在那里看到了一些错误:

1) 你的 PartialView 必须发布一个 Lab,所以让它为 Lab 强类型化,因为 HTML Helpers 将生成默认 ModelBinder 无法处理的 HTML,以便使用 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 的主要目的,在视图中显示复杂类型!任何其他操作都需要创建自定义 ModelBinder 以通过请求进行交互并将模型重新构建到服务器中。

希望这对你有帮助!我真的从这个问题中得到了这个!

于 2013-06-04T17:58:15.360 回答
0

在评论的帮助下,我能够找出问题所在。当我将参数添加到 html.beginform 时,它不再使用 patientid 发送我的 url 参数。不知道为什么?我的正常创建视图有这个,所以我的隐藏参数获取了这个值。我最终在我的控制器中设置了值,以便表单中的隐藏参数能够获取它。这是我的获取索引现在解决了这个问题:

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);
        }

我还发现这篇文章很有帮助,因为我发现我可以指定一个模型来发送到部分。

于 2013-06-05T13:58:11.287 回答