如何发布部分查看数据?

时间:2012-04-06 07:44:13

标签: asp.net-mvc-3

任何输入都非常感激:)

我想知道一件事是否可以在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" />
}

感谢。

2 个答案:

答案 0 :(得分:1)

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

这是可能的,因为HTML规范,表单上的所有数据,已提交按钮发送到提交操作网址。

答案 1 :(得分: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. 自己明确设置前缀

  4. 像这样:

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