【发布时间】:2019-03-10 13:40:01
【问题描述】:
我正在使用 Asp.net c# MVC 开发一个项目,我想使用数据注释对模型进行验证,如下所示:
public class MainRepository
{
public int Id { get; set; }
[Required]
public int Category_Id { get; set; }
[Required]
public int Department_Id { get; set; }
[Required]
public DateTime Start_Date { get; set; }
}
我有一个控制器作为 PM 控制器,具有以下注册方法。
public ActionResult Register()
{
var event_category = _context.Event_Categories.ToList();
var departments = _context.dept.ToList();
var vm = new InsertEdit_ViewModel
{
evt_catgrss = event_category,
depts = departmetns
};
return View(vm);
}
这是 InsertEdit 视图模型:
public class InsertEdit_ViewModel
{
public MainRepository Main_RP { get; set; }
public List<Event_Categories> evt_catgrss { get; set; }
public List<Departments> depts { get; set; }
}
public InsertEdit_ViewModel()
{
Main_RP = new MainRepository();
evt_catgrss = new List<Event_Categories>();
depts = new List<Departments>();
}
}
这是注册方法的视图:
@model Project.ViewModel.InsertEdit_ViewModel
@using (Html.BeginForm("Store", "PM", FormMethod.Post, new { enctype = "multipart/form-data"}))
{
<div class="form-group">
<label>Event Category</label><br/>
@Html.DropDownListFor(a => a.Main_RP.Category_Id, new SelectList(Model.evt_catgrss, "Id", "type_of_event"), "Select a category", new { @class = "form-control btn-group dropdown-menu" })
@Html.ValidationMessageFor(a=> a.Main_RP.Category_Id)
</div>
<div class="form-group">
<label>Department</label>
@Html.DropDownListFor(a => a.Main_RP.Department_Id, new SelectList(Model.depts, "Id", "DepartmentName"), "Select Employee Department", new { @class = "form-control btn-group dropdown-menu" })
@Html.ValidationMessageFor(a=> a.Main_RP.Department_Id)
</div>
<div class="form-group">
<label>Start Date</label>
@Html.TextBoxFor(a => a.Main_RP.Start_Date, "Select Estimated Date of Start", new { @class = "form-control", @readonly = "readonly", @style = "cursor :default; background-color:#d4d4d4; font-size:11px;" })
@Html.ValidationMessageFor(a=> a.Main_RP.Start_Date)
</div>
@Html.AntiForgeryToken();
<button class="btn btn-primary">Register</button>
}
最后这是 PM 控制器中的 Store 方法
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Store(InsertEdit_ViewModel pmI)
{
if (!ModelState.IsValid)
{
var event_category = _context.Event_Categories.ToList();
var departments = _context.dept.ToList();
var vm = new InsertEdit_ViewModel
{
evt_catgrss = event_category,
depts = departmetns
};
return View("Register",vm);
}
_context.main_repz.Add(pmI.Main_RP);
_context.SaveChanges();
return RedirectToAction("Index", "SystemAdmin");
}
现在直到这一部分一切正常,包括验证。但是每当我想用另一种方法更改事件的日期时,我都会遇到问题,如下所示:
这是 PM 控制器中的更改方法:
public ActionResult Change(int? Id)
{
var EventDetails = _context.main_repz.Include(a => a.Event_Categories).SingleOrDefault(a => a.Id == Id);
var vm = new ChangeVM()
{
Main_RP = EventDetails
};
return View(vm);
}
这是 ChangeVM (ViewModel)
public class ChangeVM
{
public MainRepository Main_RP { get; set; }
public ChangeVM()
{
Main_RP = new MainRepository();
}
}
这是更改方法的视图
@model FEFA_MIS.ViewModel.ChangeVM
@using (Html.BeginForm("ChangeDate", "PM", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-group">
<label>Select New Date</label>
@Html.TextBoxFor(a => a.Main_RP.Start_Date, "{0:}", new { @class = "form-control"})
@Html.ValidationMessageFor(a=> a.Main_RP.Start_Date)
</div>
@Html.AntiForgeryToken();
@Html.HiddenFor(a => a.Main_RP.Id);
<button class="btn btn-primary">Request</button>
}
最后这是 PM 控制器中的 ChangeDate 方法
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ChangeDate(ChangeVM ap)
{
if (!ModelState.IsValid)
{
return View("Change",ap);
}
var item = _context.main_repz.Single(a => a.Id == ap.Main_RP.Id);
item.Start_Date = ap.Main_RP.Start_Date;
_context.SaveChanges();
return RedirectToAction("Success", "PM");
}
现在这一次不正常了,
意思是,如果我不选择新的日期,它会给出验证消息,这很好。
但是当我选择新日期时它不会继续,因为我认为它也期望 Category_Id 和 Department_Id,但它们不再是 ChangeDate 方法的一部分,它们是用于注册的 Store 方法的一部分。
如果我没记错的话,我认为模型中的所有三个 [Required] 字段都属于一个 ModelState,但无论如何我被困在这里......
有什么解决办法?视图模型可以只访问特定的属性而不是调用整个类(就像我的例子一样)吗?
【问题讨论】:
-
@haim770 正如你在我的代码中看到的,有两种不同的视图模型
标签: c# asp.net-mvc validation