【发布时间】:2016-10-18 02:49:26
【问题描述】:
我在角色和订阅上得到一个NullReferenceException,我不知道为什么,我的Model.State 检查是false,所以它是无效的。我已将与我的 get 方法相同的视图模型传递给我的 post 方法。
表格
<div class="form-group">
@Html.LabelFor(m => m.User.UserRoles)
@Html.DropDownListFor(m => m.User.SelectedUserRoleId, Model.User.UserRoles, "Role", new { id = "txtBusinessName", @class = "form-control", placeholder = "Business Name" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Business.Subscriptions)
@Html.DropDownListFor(m => m.Business.SelectedSubscriptionId, Model.Business.Subscriptions, "Subscription Type", new { id = "txtBusinessName", @class = "form-control", placeholder = "Business Name" })
</div>
型号
public class RegisterationViewModel
{
public BusinessViewModel Business { get; set; }
public UserViewModel User { get; set; }
}
UserViewModel 属性出错
public Guid SelectedUserRoleId {get; set;}
[Display(Name = "Role")]
[Required]
public IEnumerable<SelectListItem> UserRoles { get; set; }
BusinessViewModel 属性出错
public Guid SelectedSubscriptionId {get; set; }
[Display(Name = "Subscription Type")]
[Required]
public IEnumerable<SelectListItem> Subscriptions { get; set; }
获取方法
[HttpGet]
public ActionResult Register()
{
var businessSubscriptionViewModels = new List<BusinessSubscriptionViewModel>();
var userRoleViewModels = new List<UserRoleViewModel>();
var registrationViewModel = new RegisterationViewModel();
businessSubscriptionViewModels.AddRange(
_subscriptionServiceClient.GetBusinessSubscriptionContracts()
.Select(Mapper.Map<BusinessSubscriptionContract, BusinessSubscriptionViewModel>));
registrationViewModel.Business = new BusinessViewModel
{
Subscriptions = new SelectList(businessSubscriptionViewModels, "Id", "Name")
};
userRoleViewModels.AddRange(
_userRoleServiceClient.GetUserRoles().Select(Mapper.Map<UserRoleContract, UserRoleViewModel>));
registrationViewModel.User = new UserViewModel
{
UserRoles = new SelectList(userRoleViewModels, "Id", "Name")
};
return View(registrationViewModel);
}
发布方式
[HttpPost]
public ActionResult Register(RegisterationViewModel registerationViewModel)
{
if (!ModelState.IsValid)
{
return View();
}
var businessContract = Mapper.Map<BusinessViewModel, BusinessContract>(registerationViewModel.Business);
var registeredBusiness = _businessRegistrationServiceClient.CreateBusiness(businessContract);
var userContract = Mapper.Map<UserViewModel, UserContract>(registerationViewModel.User);
var registeredUser = _userServiceClient.CreateUser(businessContract.ID, userContract);
return View(registerationViewModel);
}
【问题讨论】:
-
也许模型绑定器无法将
string SelectListItem.Value绑定为 Guid?要对此进行测试,请将模型中的SelectedUserRoleId更改为string。 -
我还注意到您在两个 DropDownLists 的 HtmlAttributes 中为
id传递了相同的值。让 MVC 设置 ID,以便模型绑定器识别它。 -
在您的发布方法中,您“返回 View();”没有模型。我不是专家,但在我看来这可能是个问题。
标签: asp.net-mvc forms http-post html.dropdownlistfor selectlistitem