如何发布部分视图数据?

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

感谢您的选择。
2个回答

1

这基本上可以像你所想的那样工作 - 部分页面没有什么固有的东西会阻止这一点,最终输出的HTML才是最重要的。

你的代码问题在于,假设你的_Passenger视图的模型类型是Passengers,而_PassangerContact视图的模型类型是Contact。这意味着,如果你使用标准的HtmlHelper扩展(例如Html.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


1

是的,确实可以这样做,但是控制器通常只处理每个请求中的一个模型,因此您的模型应该声明包含两个部分子模型的属性,或者包含子模型本身。

这是可能的,因为HTML规范要求将表单上的所有数据发送到提交操作URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接