Asp.net MVC.Net绑定复杂模型?

Asp.net MVC.Net绑定复杂模型?,asp.net,ajax,asp.net-mvc,razor,model-binding,Asp.net,Ajax,Asp.net Mvc,Razor,Model Binding,我有以下代码,与现有的客户。 我需要创建一个创建订单的表单,并将其传递给我的控制器 我试着在那个页面上把我的模型类型改为Order而不是Customer,但是我还需要传递Order对象,或者至少传递OrderId 模型 public class Customer { public int Id { set; get; } public string FirstName { set; get; } public string LastName { set; get; } p

我有以下代码,与现有的客户。 我需要创建一个创建订单的表单,并将其传递给我的控制器

我试着在那个页面上把我的模型类型改为Order而不是Customer,但是我还需要传递Order对象,或者至少传递OrderId

模型

public class Customer
{
   public int Id { set; get; }
   public string FirstName { set; get; }
   public string LastName { set; get; }
   public List<Order> Orders { get; set;}
}

public class Order
{
   public int Id { set; get; }
   public string ItemName { set; get; }
   public DateTime SomeDate { set; get; }
}
看法

@model Company.Application.model.Customer;
@使用(Ajax.BeginForm(新的AjaxOptions{UpdateTargetId=“result”}))
{
//如何将此绑定到Order对象?
//我不能将模型定义为订单,因为这样我需要单独传递给客户
@Html.TextBoxFor(o=>o.Orders[0].ItemName)
@Html.TextBoxFor(o=>o.Orders[0].SomeDate)
}

我想您正在寻找这篇博客文章所描述的内容:

引自博客:

如果签名如下所示:

public ActionResult Blah(IDictionary<string, Company> stocks) {
  // ...
}
stocks[0].Key = "MSFT"
stocks[0].Value.CompanyName = "Microsoft Corporation"
stocks[0].Value.Industry = "Computer Software"
stocks[1].Key = "AAPL"
stocks[1].Value.CompanyName = "Apple, Inc."
stocks[1].Value.Industry = "Consumer Devices"
那就好像我们写过:

stocks = new Dictionary<string, Company>() {
  { "MSFT", new Company() { CompanyName = "Microsoft Corporation", Industry = "Computer Software" } },
  { "AAPL", new Company() { CompanyName = "Apple, Inc.", Industry = "Consumer Devices" } }
};
stocks=newdictionary(){
{“MSFT”,新公司(){CompanyName=“微软公司”,Industry=“计算机软件”},
{“AAPL”,新公司(){CompanyName=“Apple,Inc.”,Industry=“Consumer Devices”}
};

我想你正在寻找这篇博客文章所描述的:

引自博客:

如果签名如下所示:

public ActionResult Blah(IDictionary<string, Company> stocks) {
  // ...
}
stocks[0].Key = "MSFT"
stocks[0].Value.CompanyName = "Microsoft Corporation"
stocks[0].Value.Industry = "Computer Software"
stocks[1].Key = "AAPL"
stocks[1].Value.CompanyName = "Apple, Inc."
stocks[1].Value.Industry = "Consumer Devices"
那就好像我们写过:

stocks = new Dictionary<string, Company>() {
  { "MSFT", new Company() { CompanyName = "Microsoft Corporation", Industry = "Computer Software" } },
  { "AAPL", new Company() { CompanyName = "Apple, Inc.", Industry = "Consumer Devices" } }
};
stocks=newdictionary(){
{“MSFT”,新公司(){CompanyName=“微软公司”,Industry=“计算机软件”},
{“AAPL”,新公司(){CompanyName=“Apple,Inc.”,Industry=“Consumer Devices”}
};

以下是您应如何处理此问题:

如果您确实不想制作viewmodel,请在viewbag中传递customerID(请注意,制作viewmodel是可以的!)

您的发布方法:

[HttpPost]
public ActionResult Create(int CustomerID, Order order)
{
  //create your order
}
您的cshtml

@model Company.Application.Model.Order;

@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "result" }))
{
    @Html.TextBoxFor(o => o.ItemName)
    @Html.TextBoxFor(o => o.SomeDate)
    @Html.Hidden("CustomerID",ViewBag.CustomerID)
    <input type="submit" value="Add" />
}
@model Company.Application.model.Order;
@使用(Ajax.BeginForm(新的AjaxOptions{UpdateTargetId=“result”}))
{
@Html.TextBoxFor(o=>o.ItemName)
@Html.TextBoxFor(o=>o.SomeDate)
@隐藏(“CustomerID”,ViewBag.CustomerID)
}

这是您应该如何处理的:

如果您确实不想制作viewmodel,请在viewbag中传递customerID(请注意,制作viewmodel是可以的!)

您的发布方法:

[HttpPost]
public ActionResult Create(int CustomerID, Order order)
{
  //create your order
}
您的cshtml

@model Company.Application.Model.Order;

@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "result" }))
{
    @Html.TextBoxFor(o => o.ItemName)
    @Html.TextBoxFor(o => o.SomeDate)
    @Html.Hidden("CustomerID",ViewBag.CustomerID)
    <input type="submit" value="Add" />
}
@model Company.Application.model.Order;
@使用(Ajax.BeginForm(新的AjaxOptions{UpdateTargetId=“result”}))
{
@Html.TextBoxFor(o=>o.ItemName)
@Html.TextBoxFor(o=>o.SomeDate)
@隐藏(“CustomerID”,ViewBag.CustomerID)
}

如果要创建订单,则对象应为订单。问题是您希望将其与客户关联?不确定为什么不使用订单对象进行绑定。
public ActionResult(Customer)
这是打字错误吗?缺少函数名。@Ravi谢谢,这是一个类型修复了它。@MikeC。问题是,如果order不了解客户的任何信息,并且我不想向order添加客户id,那么如果我切换方法以期望订单,我如何知道该订单属于哪个客户?尽量避免使用黑客代码,不要单独传递客户id如果您正在创建订单,那么您的对象应该是订单。问题是您希望将其与客户关联?不确定为什么不使用订单对象进行绑定。
public ActionResult(Customer)
这是打字错误吗?缺少函数名。@Ravi谢谢,这是一个类型修复了它。@MikeC。问题是,如果order不了解客户的任何信息,并且我不想向order添加客户id,那么如果我切换方法以期望订单,我如何知道该订单属于哪个客户?试图避免黑客代码,不单独传递客户id为什么不能使用?只需创建一个既有客户属性又有订单属性(以及您需要的任何其他属性)的新模型类即可。这样,您可以同时拥有这两个功能,并更轻松地将它们连接在一起。您不仅限于与数据库匹配的模型。我总是这样做。我通常为我所有的模型制作一个viewmodel,我确实提到过,但OP似乎不想这样做,所以我只是对此发表了评论。此外,我认为通过ViewBag传递最多两个项目是可以接受的。如果是3个或更多,我肯定会比这里更强烈地推荐viewmodel。事实上,根据我的经验,即使viewmodel为复杂的应用程序添加了一个额外的层,这也是值得的。我一直在使用ViewModel模式和AutoMapper,到目前为止它非常棒。为什么不能使用它来创建一个新的模型类,它既有Customer属性又有Order属性(以及您需要的任何其他属性)。这样,您可以同时拥有这两个功能,并更轻松地将它们连接在一起。您不仅限于与数据库匹配的模型。我总是这样做。我通常为我所有的模型制作一个viewmodel,我确实提到过,但OP似乎不想这样做,所以我只是对此发表了评论。此外,我认为通过ViewBag传递最多两个项目是可以接受的。如果是3个或更多,我肯定会比这里更强烈地推荐viewmodel。事实上,根据我的经验,即使viewmodel为复杂的应用程序添加了一个额外的层,这也是值得的。我一直在使用ViewModel模式和AutoMapper,到目前为止,它非常棒。