c# - Ajax.beginform 将空值发布到控制器
问题描述
我已经搜索了很多,但还没有找到答案。我有一个表格的部分视图:
@model PetDate.Models.ProfileDataModel
@using (Ajax.BeginForm("UpdateProfileInfo", "Profile", new AjaxOptions { HttpMethod = "Post", OnFailure = "", OnSuccess = "" }))
{
<div class="form-group">
@Html.LabelFor(x => x.FullName, new { @class = "text-info" })
@Html.TextBoxFor(x => x.FullName, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(x => x.Email, new { @class = "text-info" })
@Html.TextBoxFor(x => x.Email, new { @class = "form-control", @type = "email" })
</div>
<div class="form-group">
@Html.LabelFor(x => x.BirthDay, new { @class = "text-info" })
@Html.TextBoxFor(x => x.BirthDay, new { @class = "form-control", @type = "datetime" })
</div>
<div class="form-group">
@Html.LabelFor(x => x.Username, new { @class = "text-info" })
@Html.TextBoxFor(x => x.Username, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(x => x.AddressText, new { @class = "text-info" })
@Html.TextBoxFor(x => x.AddressText, new { @class = "form-control", @id = "adresse" })
@Html.HiddenFor(x => x.Postal, new { @id = "postalAddress" })
@Html.HiddenFor(x => x.Street, new { @id = "streetAddress" })
@Html.HiddenFor(x => x.HouseNumber, new { @id = "houseNumberAddress" })
@Html.HiddenFor(x => x.story, new { @id = "storyAddress" })
@Html.HiddenFor(x => x.roomPlacement, new { @id = "roomPlacementAddress" })
</div>
<div class="form-group">
@Html.LabelFor(x => x.Description, new { @class = "text-info" })
@Html.TextAreaFor(x => x.Description, new { @class = "initTinyMCE" })
</div>
<div class="form-group">
<button type="submit" class="btn btn-outline-warning btn-lg" >Opdatér information</button>
</div>
}
此表单发布到我的控制器,但是当我查看控制器中的内容时,所有值都显示为空。
我的控制器:
namespace PetDate.Controllers
{
public class ProfileController : MasterController
{
[ValidateInput(false)]
[HttpPost]
public ActionResult UpdateProfileInfo(ProfileDataModel data)
{
int ownerID = Convert.ToInt32(Session["userID"]);
if (ModelState.IsValid)
{
using (var context = new ModelContainer())
{
var ownerProfile = context.Owners.Where(x => x.ID == ownerID).FirstOrDefault();
var ownerLogin = context.Logins.Where(x => x.Owner_ID == ownerID).FirstOrDefault();
Address ownerAddress = null;
if (data.story != 0 && data.roomPlacement != string.Empty)
{
ownerAddress = context.Addresses.Where(x => x.Postal == data.Postal && x.Street == data.Street && x.Housenumber == Convert.ToInt32(data.HouseNumber) && x.Story == Convert.ToInt32(data.story) && x.Door == data.roomPlacement).FirstOrDefault();
}
else {
ownerAddress = context.Addresses.Where(x => x.Postal == data.Postal && x.Street == data.Street && x.Housenumber == Convert.ToInt32(data.HouseNumber)).FirstOrDefault();
}
if (ownerProfile != null && ownerLogin != null)
{
// update content.
ownerProfile.FullName = data.FullName;
ownerProfile.Email = data.Email;
ownerProfile.Birthday = data.BirthDay;
ownerProfile.Description = data.Description;
ownerProfile.ProfilePicture = data.ProfilePicture;
ownerLogin.UserName = data.Username;
if (ownerAddress != null)
{ // already created the address, just get the ID
ownerProfile.Address_FK = ownerAddress.ID;
}
else
{ // has not been created before, create new one.
var obj = new Address()
{
Postal = data.Postal,
Street = data.Street,
Housenumber = Convert.ToInt32(data.HouseNumber),
Story = data.story,
Door = data.roomPlacement != string.Empty ? data.roomPlacement : ""
};
}
context.SaveChanges();
return new HttpStatusCodeResult(200, "ok");
}
else
{
return new HttpStatusCodeResult(400, "failure");
}
}
}
else
{
return new HttpStatusCodeResult(400, "failure");
}
}
}
}
变量 Data 具有空值。我有一个几乎相似的表单和控制器,它可以处理其他一些可以完美运行的事情......
所以我有点迷茫,为什么返回的值只是空......
我的模型如果有兴趣:
public class ProfileDataModel
{
[Required]
public string FullName { get; internal set; }
[Required]
public DateTime? BirthDay { get; internal set; }
[Required]
public string Description { get; internal set; }
[Required]
public string Email { get; internal set; }
[Required]
public string AddressText { get; internal set; }
[Required]
public string Postal { get; set; }
[Required]
public string Street { get; set; }
[Required]
public int HouseNumber { get; set; }
public int story { get; set; }
public string roomPlacement { get; set; }
[Required]
public string ProfilePicture { get; internal set; }
[Required]
public string Username { get; internal set; }
public string Password { get; set; }
}
解决方案
模型绑定不起作用,DefaultModelBinder
因为您在某些属性中使用internal
set 访问器和get 访问器,如下所示:public
public string FullName { get; internal set; }
上述定义意味着:
- 应用程序中的其他代码可以读取属性值
- 只有在与您的应用程序相同的程序集中的代码才能向属性写入新值
由于DefaultModelBinder
使用反射对属性的后端字段执行读取和写入值(您可以在其定义中看到),因此 get 和 set 访问器都必须设置public
为启用具有自动属性的双向模型绑定。
因此,viewmodel 类中的所有属性都必须将 get 和 set 访问器定义为 public,以允许从 HTML 助手分配的属性值在视图中:
public string FullName { get; set; }
推荐阅读
- python - 使用 Cyclus 将 Pandas 中的数据排序到工作表中 - 一张表中的多个数据
- hadoop - 如果我的 hadoop (HDP) 集群已经使用 AD/LDAP,为什么还要对它进行 Kerberise?
- javascript - 下载原始纹理数据以绕过 cors?
- azure - 使用 SFTP-ssh 连接器将从 SFTP 服务器加载的多个新文件复制到 Azure Blob 存储
- microsoft-teams - Microsoft Teams,让当前用户加入通话
- postgresql - 如何在 sequelize 中使用 findAll() 方法从 postgresql 获取表数据?
- responsive-design - Angular 材质和响应式布局网格 css 框架
- javascript - Angular - 如何使用一个功能来管理多个切换/单击事件?
- excel - Excel根据其他组类别计算新类别的值
- python - 如何在新的 Tkinter 窗口中显示导入的数据框?