MVC 5单视图中的多个模型

igg*_*web 9 forms asp.net models asp.net-mvc-5

有人可以提供一个如何在一个视图中组合两个模型的示例吗?

目前我有一个名为RecordCard的页面,其中包含:

@model IEnumerable<WebApplication1.Models.Weight>
Run Code Online (Sandbox Code Playgroud)

这由AccountController中的以下代码提供:

public ActionResult RecordCard()
{
    var UserId = User.Identity.GetUserId();
    var weightModel = from m in db.Weights where m.UserId == UserId select m;
    return View(weightModel);
}
Run Code Online (Sandbox Code Playgroud)

RecordCard页面还包含一个绑定到以下类的表单:

public class AddWeightModel
{
    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "Stone")]
    public Nullable<short> Stone { get; set; }

    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "Pound")]
    public Nullable<short> Pound { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,这些是具有不同目的的两个单独模型,因此如何组合到包含IEnumerable列表和一组表单元素的单个模型,这些元素最终将正确地发布到AccountController以使用以下代码将记录添加到数据库:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RecordCard(Weight Model)
{
    if (ModelState.IsValid)
    {
        using (WebApplication1Entities db = new WebApplication1Entities())
        {
            Weight weight = new Weight();
            weight.UserId = User.Identity.GetUserId();
            weight.Stone = Model.Stone;
            weight.Pound = Model.Pound;
            weight.Date = System.DateTime.Now;

            db.Weights.Add(Model);
            db.SaveChanges();
        }
    }
    return View(Model);
}
Run Code Online (Sandbox Code Playgroud)

我在下面列出了Weight类:

public partial class Weight
{
    public int Id { get; set; }
    public string UserId { get; set; }
    public Nullable<short> Stone { get; set; }
    public Nullable<short> Pound { get; set; }
    public Nullable<System.DateTime> Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此处还有WebApplication1Entities类,它将权重表声明为权重:

public partial class WebApplication1Entities : DbContext
{
    public WebApplication1Entities()
        : base("name=WebApplication1Entities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<Weight> Weights { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请解释需要修改的内容以及无论我尝试阅读,遵循和实施的内容,我似乎都缺少某些内容.

任何帮助将非常感激 :-)

bra*_*der 13

我想说这是ViewModel在这里使用的好例子.我会建议像 -

ViewModel使用两个类的组合创建

public class AddWeightModel
{
    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "Stone")]
    public Nullable<short> Stone { get; set; }

    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "Pound")]
    public Nullable<short> Pound { get; set; }
}
....
public partial class Weight
{
    public int Id { get; set; }
    public string UserId { get; set; }
    public Nullable<short> Stone { get; set; }
    public Nullable<short> Pound { get; set; }
    public Nullable<System.DateTime> Date { get; set; }
}
.....
public class WeightViewModel
{
    public IList<AddWeightModel> AddWeightModel { get; set; }
    public Weight Weight { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后更改您的视图以接受视图模型 -

@model WeightViewModel
Run Code Online (Sandbox Code Playgroud)

最后修改你的控制器以应对变化 -

public ActionResult RecordCard()
    {
        var UserId = User.Identity.GetUserId();
        var weightModel = from m in db.Weights where m.UserId == UserId select m;
        var viewModel = new WeightViewModel
        {
            Weight = weightModel,
            AddWeightModel = new List<AddWeightModel>(){}
        };
        return View(viewModel);
    }

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RecordCard(WeightViewModel viewModel)
{
    Weight Model = viewModel.Weight;
    if (ModelState.IsValid)
    {
        using (WebApplication1Entities db = new WebApplication1Entities())
        {
            Weight weight = new Weight();
            weight.UserId = User.Identity.GetUserId();
            weight.Stone = Model.Stone;
            weight.Pound = Model.Pound;
            weight.Date = System.DateTime.Now;

            db.Weights.Add(Model);
            db.SaveChanges();
        }
    }
    return RedirectToAction("RecordCard");
}
Run Code Online (Sandbox Code Playgroud)


The*_*kZn 8

我之前已经解决了这个问题,可以找到一个优雅的解决方案.

首先,您需要设置要发送的主要类,以及"持有者"类来存储它们以最终发送到view.
您可能已经发现,这是因为view无法向其发送多个模型.

public class WebsiteTheme
{
    public string Color { get;set; }
    public string Title { get;set; }

    public WebsiteTheme() {
         Color = "blue";
         Title = "test website";
    }
}

public class User
{
    public string Name { get;set; }
    public string Gender { get;set; }

    public User() {
         Name = "Anonymous";
         Gender = "Unspecified";
    }
}

public class ToPage
{
    public WebsiteTheme WebsiteTheme{ get; set; }
    public User User { get; set; }

    public ToPage() {
         websiteTheme = new WebsiteTheme();
         user = new User();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您向页面发送任意数量的课程.

然后,在您的控制器中,您需要填充这些类.确保首先初始化它们,然后将填充的类设置为holder类.

WebsiteTheme websiteTheme = new WebsiteTheme();
websiteTheme.Color = "orange";

User user = new User();
user.Name = "Darren";

ToPage toPage = new ToPage();
toPage.User = user;
toPage.WebsiteTheme = websiteTheme;

return View(toPage);
Run Code Online (Sandbox Code Playgroud)

在您看来,您可以以任何您想要的方式打电话给他们.但请务必HolderModel.SpecifiedModel在每种情况下使用.

@model WebApplication1.Models.ToPage

@Html.DisplayFor(model => model.User.Name)
Run Code Online (Sandbox Code Playgroud)