【发布时间】:2017-07-17 18:08:01
【问题描述】:
我正在开发一个 ASP.NET MVC 项目。我已经创建了在我的项目中使用的各种模型和视图模型。我还使用种子数据为我的数据库表播种,但在实现注册视图时,我测试了表单,但得到 0 作为插入数据库表的 Id 部分的值。我截断了表格并做了一个新的插入,但仍然有同样的错误。
下面是用户表的模型
public class User
{
[Key]
public byte Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string RefIndicator { get; set; }
public Team TeamCategory { get; set; }
public byte TeamId { get; set; }
public bool IsRegistered { get; set; }
public DateTime DateRegistered { get; set; }
public DateTime? LastModified { get; set; }
public UserRoles UserRoles { get; set; }
public byte UserRolesId { get; set; }
}
下面是我为需要在视图中使用的团队模型属性创建的视图模型
public class RegisterFormViewModel
{
public User Users { get; set; }
public byte Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public IEnumerable<Team> Teams { get; set; }
public byte TeamId { get; set; }
public string RefIndicator { get; set; }
public bool IsRegistered { get; set; }
public DateTime DateRegistered { get; set; }
public byte UserRolesId { get; set; }
}
这是用户控制器的注册操作,用于初始化注册视图的值
public ActionResult Register()
{
var AppUser = User.Identity.Name.Substring(5);
var AppUserEmail = AppUser + "@nlng.com";
int index = AppUser.IndexOf('.');
var FirstName = AppUser.Substring(0, index);
var LastName = AppUser.Substring(index + 1);
var IsRegistered = true;
var UserRolesId = 1;
var DateRegistered = HttpContext.Timestamp;
var teams = _context.Team.ToList();
var viewModel = new RegisterFormViewModel{
Email = AppUserEmail,
FirstName = FirstName,
LastName = LastName,
Teams = _context.Team.ToList(),
IsRegistered = IsRegistered,
UserRolesId = (byte)UserRolesId,
DateRegistered = DateRegistered
};
return View("Register", viewModel);
}
最后是注册页面的关联视图
@model eLeave.ViewModel.RegisterFormViewModel
@{
ViewBag.Title = "Register";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>User Registration</h2>
@using (Html.BeginForm("Save", "User"))
{
<div class="form-group">
@Html.LabelFor(r=>r.FirstName)
@Html.TextBoxFor(r => r.FirstName, new { @class = "form-control", @readonly = true })
</div>
<div class="form-group">
@Html.LabelFor(r => r.LastName)
@Html.TextBoxFor(r => r.LastName, new { @class = "form-control", @readonly = true })
</div>
<div class="form-group">
@Html.LabelFor(r => r.Email)
@Html.TextBoxFor(r => r.Email, new { @class = "form-control", @readonly = true })
</div>
<div class="form-group">
@Html.LabelFor(r => r.TeamId)
@Html.DropDownListFor(r => r.TeamId, new SelectList(Model.Teams, "Id", "TeamName"), "Select your Team", new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(r => r.RefIndicator)
@Html.TextBoxFor(r => r.RefIndicator, new { @class = "form-control" })
</div>
@Html.HiddenFor(m => m.IsRegistered)
@Html.HiddenFor(m => m.DateRegistered)
@Html.HiddenFor(m => m.UserRolesId)
@Html.HiddenFor(m => m.Id)
@Html.AntiForgeryToken()
<button class="btn btn-primary">Register</button>
}
最后是 userController 的保存动作
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(User user)
{
if (!ModelState.IsValid)
{
var viewModel = new RegisterFormViewModel
{
Users = user,
Teams = _context.Team.ToList()
};
return View("Register", viewModel);
}
if (user.Id == 0)
{
_context.User.Add(user);
}
else
{
var usersInDb = _context.User.Single(m => m.Id == user.Id);
usersInDb.FirstName = user.FirstName;
usersInDb.LastName = user.LastName;
usersInDb.TeamCategory = user.TeamCategory;
usersInDb.RefIndicator = user.RefIndicator;
usersInDb.UserRoles = user.UserRoles;
usersInDb.IsRegistered = user.IsRegistered;
usersInDb.Email = user.Email;
usersInDb.DateRegistered = user.DateRegistered;
}
_context.SaveChanges();
return RedirectToAction("Index", "User");
}
Save Action 基本上做了两件事......它保存了一个新表单,也用于更新数据。
如果我的代码中的错误可以被找出来,我们将不胜感激。
【问题讨论】:
-
我不认为这是原因,但是您的
User的Id是byte类型,也许您应该使用Guid(又名UUID)或包含的字符串引导表示(甚至是int)。你在使用实体框架吗? -
你真的在你的表上定义了自动增量吗?因为我没有看到任何实际上会导致自动增量行为的东西..
-
我使用 EF 代码优先方法来创建数据并将其播种到表中
-
@Alisson 是的,我正在使用实体框架
-
@Alisson 是的,我正在使用实体框架
标签: c# asp.net asp.net-mvc asp.net-mvc-4