任何输入都非常感激:)
我想知道一件事是否可以在MVC中发布多个部分视图数据?(意味着我想将部分视图数据更新为DATABASE)
以下是示例:
型号: -
public class PassengerViewModel
{
public List<PassengerModel> Passengers { get; set; }
public ContactModel Contact { get; set; }
}
控制器: -
[RequiredAuthentication]
public ActionResult Passenger()
{
var passengrViewMdl = new PassengerViewModel()
{
Contact = new ContactModel(),
Passengers = psngrService.LoadPassengers(Convert.ToInt32(Session["LPORefNO"]))
};
return View(passengrViewMdl);
}
[HttpPost]
public ActionResult Passenger(PassengerViewModel passengerViewModel)
{
Here i want to update Passengers & Contact information
}
查看: -
@model QR.LPO.Core.Models.PassengerViewModel
@{
ViewBag.Title = "Add Passengers";
}
@using (Html.BeginForm())
{
@Html.Partial("_Passenger", Model.Passengers);
@Html.Partial("_PassengerContact", Model.Contact);
<input type="submit" value="Submit" />
}
感谢。
答案 0 :(得分:1)
是的,确实可以,但是,控制器通常只能为每个请求使用一个模型,因此您的模型应该在其中声明了部分子模型或子模型本身的属性。
这是可能的,因为HTML规范,表单上的所有数据,已提交按钮发送到提交操作网址。
答案 1 :(得分:1)
这几乎可以正常工作 - 部分内容没有什么可以防止这种情况,最终输出的html非常重要。
您的代码存在的问题可能是_Passenger
视图的模型属于Passengers
类型,而_PassangerContact
视图的模型属于Contact
类型。这意味着,如果您标准HtmlHelper
个扩展名(例如Html.Textbox(...)
或Html.TextboxFor(...)
,那么他们生成的字段将不会有Contact.Name
这样的全名,而只是相对于他们的名称模型,如Name
。这将导致模型绑定在后期操作中失败。
您可以通过多种方式解决此问题。
只需在子视图中使用相同的模型类型(PassengerViewModel
),然后编写@Html.TextboxFor(m => m.Contact.Name)
之类的代码。
使用Html.Partial
而不是Html.EditorFor(...)
。这会将正确的前缀信息传递到子视图中,以便正确生成字段名称。
自己明确设置前缀
像这样:
@{
var childViewData = new ViewDataDictionary(this.ViewData);
childView.TemplateInfo.HtmlFieldPrefix = "Contact";
}
@Html.Partial("_PassengerContact", Model.Contact, childViewData)
您还可以查看自己创建Html.PartialFor
重载,如此stackoverflow问题中所述:ASP.NET MVC partial views: input name prefixes