** 更新 **
这里的问题是 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"
}
]
我完全被这个难以理解,并且不知道为什么模型绑定器无法将表单值集合绑定到模型。任何见解我都会非常感激。