[英]Update row in Entity Framework based on input data
我有一個非常簡單的表格。 我正在從該表單中收集“雇員姓名”和“部門名稱”,如下所示。 我也有一個名為StatusID的隱藏輸入。 用戶無法查看和輸入任何數據。 但是我想根據DepartmentName輸入的數據更新此StatusID。 可以說,如果DepartmentName是IT,那么我想在StatusID行中插入“ 1”。 如果部門名稱為HR,則StatusID將更新為“ 2”。
我嘗試了許多方法來實現這一目標,但未能做到。
任何想法我怎么能做到?
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Employee</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DepartmentName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DepartmentName)
</div>
<div class="editor-field">
@Html.HiddenFor(model => model.StatusID)
</div>
<input type="submit" value="Create" />
</fieldset>
這是我創建的控制器。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
db.Employee.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(employee);
}
這是我的課:
public partial class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
public string DepartmentName{ get; set; }
public int StatusID { get; set; }
}
您可以為其創建枚舉,並根據部門的狀態ID檢查枚舉條目,可以為此使用轉換器
是否有特定的原因需要在視圖中設置StatusID,難道您不就可以將它設置為控制器方法的一部分嗎?
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
switch (employee.DepartmentName)
{
case "IT":
employee.StatusID = 1
break;
case "HR":
employee.StatusID = 2
break;
default:
employee.StatusID = 1
break;
}
db.Employee.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(employee);
}
當然,如果您只想在值1和2之間進行檢查,則可以從switch語句更改為三元運算符。
因此, StatusID
取決於DepartmentName
並且此邏輯屬於Employee
類,可以在設置DepartmentName
時設置StatusID
:
private string deparmentName;
public string DepartmentName
{
get { return deparmentName; }
set
{
deparmentName = value;
switch(deparmentName)
{
case "IT" : StatusID = 1; break;
case "HR" : StatusID = 2; break;
default:
StatusID = 0; break;
}
}
}
請記住,該用戶不僅可以輸入大寫字母,還可以輸入數據。 還考慮對部門使用enum
:
public enum Department
{
None = 0,
IT = 1,
HR = 2
}
並使用此枚舉類型的單個屬性,而不是部門名稱和狀態ID的兩個屬性:
public partial class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
public Department Department { get; set; }
}
您還可以定義自己的ModelBinder以所需的方式映射這些屬性:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
object model = bindingContext.Model;
Employee employee = (Employee)model;
if (employee == null)
{
employee = new Employee();
}
string departnementName = "DepartmentName";
var departnementNameValue = bindingContext.ValueProvider.GetValue(departnementName);
try
{
if (departnementName == "IT")
{
employee.StatusID = 1;
}
}
catch (Exception ex)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex.Message);
bindingContext.ModelState.SetModelValue(departnementName, departnementNameValue);
}
return employee;
}
否則還是用switch聲明?
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
if(employee.DepartmentName == "IT")
{
employee.StatusID == 1;
}
else if(employee.DepartmentName == "HR")
{
employee.StatusID == 2;
}
else
{
employee.StatusID == 1;
}
db.Employee.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(employee);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.