表单帖子无法绑定到强类型模型MVC4

时间:2016-02-11 14:09:48

标签: c# asp.net-mvc asp.net-mvc-4

** 更新 **

这里的问题是 CompleteService 类型的最顶层容器对象被命名为" service "在我的控制器POST方法下面。默认模型绑定器变得混乱,因为此对象和内部属性服务也被命名为" service "。由于此重复,默认模型绑定器失败。

出于某种原因,当我将强类型表单发布回我的控制器时,模型实际上并没有捕获任何值,即使我可以在调试器中查看Request.Form并查看我期望的URL值编码。我已将模型控制器操作查看 Request.Form 值包含在下面的URL编码字符串中。

我所拥有的唯一预感是,模型构造者可能正在进行新的尝试。数据上的对象。但是,我对模型Binder在执行方面的实际工作方式并不十分了解。

这是我的外部和内部模型 ,为了便于阅读而缩短了。

public class Service
{
    // Unique Id
    [DisplayName("Service Code")]
    public short ServiceCode { get; set; }



    // Service Specific Properties

    [DisplayName("Contact History Flag")]
    public bool ContactHistoryFlag { get; set; }

    [DisplayName("Customer Type")]
    [Required(AllowEmptyStrings = false)]
    public string CustomerType { get; set; }

    [DisplayName("Member Branch Service Flag")]
    public bool MemberBranchServiceFlag { get; set; }

    [DisplayName("Membership Required Flag")]
    public bool MembershipRequiredFlag { get; set; }

    ...

    // Properties that are not part of the Service Table
    private GeneralServicesMTL _mtl;

    public SelectList CustomerTypeDropDown
    {
        get
        {
            if (_customerTypeDropDown == null)
            {
                _customerTypeDropDown = _mtl.GetTypeAsDropDown("CustomerType");
            }
            return _customerTypeDropDown;
        }
    }

    ...

    public Service()
    {
        _mtl = new GeneralServicesMTL();
    }

下面的内部模型

[HttpPost]
    public ActionResult AddService(CompleteService service)
    {
        // Code doesn't expect nulls
        if (service.Xrefs == null)
        {
            service.Xrefs = new List<XrefSubMenuToServices>();
        }

        if (!ModelState.IsValid)
        {
            return View(service);
        }

        try
        {
            _mtl.SubmitCompleteService(service);

            return RedirectToAction("AllServices");
        }
        catch
        {
            // Add the error code to the page 
            TempData["Error"] = "There was a problem creating the service. Please try again.";

            return View(service);
        }
    }

这是我的控制器操作

@model Admin.MVC.Models.GeneralServices.CompleteService
@{
    ViewBag.Title = "Add Service";
}

@Html.ActionLink("Return to All Services", "AllServices", "GeneralServices", null, new { @class = "col-xs-offset-1" })

@if (TempData["Error"] != null)
{
    @Html.ValidationSummary((string)TempData["Error"]);
}

@using(Html.BeginForm("AddService", "GeneralServices", FormMethod.Post, new { id = "form", @class = "form" })){

    <div class="container">
        @Html.EditorFor(x => x.Service, "ServiceEditor") <!--Serivce-->
    </div>
    <br/>
    <div class="container">
        @Html.EditorFor(x => x.Xrefs, "MenuSubMenuEditor") <!--Menu/SubMenu-->
    </div>
    <br/>

    <div class="row">
        <input type="submit" id="submitBtn" class="btn btn-primary col-xs-offset-4 col-xs-2" value="Create Service" />
    </div>

}

@section Scripts{
    <script type="text/javascript" src="@Url.Content("~/Scripts/bootstrap.js")"></script>
    <script type="text/javascript" src="@Url.Content("~/Scripts/General Services/AddServiceScripts.js")"></script>
}

这是我的查看(可以根据要求添加部分视图,但我不认为这是问题所在)

[System.Web.HttpValueCollection]    {Service.ServiceText=Test+Service+1&Service.ServiceUrl=NONE&Service.ServiceTypeCode=1&Service.ServicePriority=180&Service.UrlUsageType=A&Service.ContactHistoryFlag=false&Service.MembershipRequiredFlag=true&Service.MembershipRequiredFlag=false&Service.RiderCategory=N%2fA&Service.CustomerType=A&Service.MemberBranchServiceFlag=false&Xrefs.MenuLocationTypeCode=}    System.Web.HttpValueCollection

最后,这是在 Request.Form 中捕获的值,在调试时从上面的控制器操作中查看。

没有可选的外部参照属性

[System.Web.HttpValueCollection]    {Service.ServiceText=Test+Service+2&Service.ServiceUrl=NONE&Service.ServiceTypeCode=2&Service.ServicePriority=329&Service.UrlUsageType=P&Service.ContactHistoryFlag=false&Service.MembershipRequiredFlag=false&Service.RiderCategory=N%2fA&Service.CustomerType=M&Service.MemberBranchServiceFlag=false&Xrefs.MenuLocationTypeCode=3&Xrefs%5b0%5d.MenuLocationTypeCode=3&Xrefs%5b0%5d.MenuCode=1&Xrefs%5b0%5d.SubMenuCode=1&Xrefs%5b0%5d.DisplayOrder=25}   System.Web.HttpValueCollection

使用可选的外部参照属性

.../server/ModelObj.js

"acls": [
  {
    "accessType": "*",
    "principalType": "ROLE",
    "principalId": "$unauthenticated",
    "permission": "DENY"
  }
]

我完全被这个难以理解,并且不知道为什么模型绑定器无法将表单值集合绑定到模型。任何见解我都会非常感激。

0 个答案:

没有答案