3

非常感谢任何输入:)

我想知道我是否可以在 MVC 中发布多个部分视图数据?(意味着我想将部分视图数据更新到数据库)

这是示例:

模型:-

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" />
}

谢谢。

4

2 回答 2

1

是的,确实可以,但是控制器通常每个请求只使用一个模型,因此您的模型应该在其中声明两个部分子模型或子模型本身的属性。

由于 HTML 规范,这是可能的,表单上所有具有提交按钮的数据都发送到提交操作 url。

于 2012-04-06T07:48:18.850 回答
1

这几乎可以按照您的方式工作-partials 没有任何固有的东西可以防止这种情况发生,最终输出的 html 才是最重要的。

您的代码的问题在于,您的_Passenger视图模型可能是 type Passengers,而您的视图模型_PassangerContact是 type Contact。这意味着,如果您的标准HtmlHelper扩展(likeHtml.Textbox(...)Html.TextboxFor(...)它们生成的字段将没有全名,例如Contact.Name,而只是与其模型相关的名称,例如Name。这将导致模型绑定在您的发布操作中失败。

您可以通过多种方式解决此问题。

  1. 只需PassengerViewModel在子视图中使用相同的模型类型 ( ),然后编写类似@Html.TextboxFor(m => m.Contact.Name).

  2. 而不是使用Html.Partial,使用Html.EditorFor(...)。这会将正确的前缀信息传递到子视图中,以便正确生成字段名称。

  3. 自己显式设置前缀

像这样:

@{
    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

于 2012-04-06T08:07:11.380 回答