ASP视图中的多个模型



我有一个ASP/MVC视图,它显示来自模型的数据,还包含一个使用不同模型的表单的部分视图。有没有办法让我把这些合并成一个视图?结果将是显示值基于模型A,但页面中的表单提交模型b,这可能吗?

如果这两件事密切相关,您可以在视图中使用视图模型来处理它们:

public class FooViewModel
{
    public SomeModelForDisplay Foo { get; set; }
    public SomeModelForForm Bar { get; set; }
}

在您的操作中,初始化两者:

public ActionResult Foo(int id)
{
    var foo = db.Foos.Find(id);
    if (foo == null)
    {
        return new HttpNotFoundResult();
    }
    var model = new FooViewModel
    {
        Foo = foo,
        Bar = new SomeModelForForm()
    };
    return View(model);
}

如果这两件事根本不相关,或者特别是,如果分部是在你的布局而不是直接视图中被调用,那么使用子操作更合适。从本质上讲,您只需处理显示部分,就像没有其他事情发生一样:

public ActionResult Foo(int id)
{
    var foo = db.Foos.Find(id);
    if (foo == null)
    {
        return new HttpNotFoundResult();
    }
    return View(foo);
}
然后,您将添加另一个操作来处理表单:
[ChildActionOnly]
public ActionResult SomeForm()
{
    var model = new SomeModelForForm();
    return PartialView("_SomeForm", model);
}
然后,添加一个局部视图来只呈现表单:

视图 Foo _SomeForm.cshtml

@model SomeModelForForm
<!-- form fields here -->

然后,在你的视图/布局中——实际上就是你想要显示表单的任何地方:

@Html.Action("SomeForm", "Foo")

这里的"Foo"是子动作所在的控制器名

我建议您使用包含模型B和C的模型A。B在加载页面时加载,C加载部分。

另一种解决方案可能是您有一个模型a(给定给razor页面),然后通过使用partial将模型B添加到页面,然后它返回a和B的混合。您只需注意字段的命名,以便使模型绑定正常工作,例如

A有

  • firstName
  • lastName

和B有

  • 手机

然后,如果您为两个字段都添加了编辑器,则控制器中可以接收的模型可以是具有

的模型C。
  • firstName
  • lastName
  • 手机

最新更新