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)
我之前已经解决了这个问题,可以找到一个优雅的解决方案.
首先,您需要设置要发送的主要类,以及"持有者"类来存储它们以最终发送到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)