C# 我应该如何验证MVC3页面的不同部分
我试图理解我应该如何独立地在MVC3页面的客户机部分进行验证,并提出了我试图实现的一个简化版本 如果我使用一种形式:C# 我应该如何验证MVC3页面的不同部分,c#,asp.net-mvc-3,validation,C#,Asp.net Mvc 3,Validation,我试图理解我应该如何独立地在MVC3页面的客户机部分进行验证,并提出了我试图实现的一个简化版本 如果我使用一种形式: 优点:当我提交回“PostData”控制器方法时,我收到表单中包含的所有数据。在本例中,两个值都是“name”和“description”,这意味着我可以实例化“PersonHobbyModel”并分配我收到的数据。我可以存储在数据库中,也可以返回相同的视图 缺点:我无法独立验证。因此,如果“名称”未完成,而我完成了“描述”,我仍然可以提交页面。(这是我试图做的事情的简化版本,我
优点:当我提交回“PostData”控制器方法时,我收到表单中包含的所有数据。在本例中,两个值都是“name”和“description”,这意味着我可以实例化“PersonHobbyModel”并分配我收到的数据。我可以存储在数据库中,也可以返回相同的视图 缺点:我无法独立验证。因此,如果“名称”未完成,而我完成了“描述”,我仍然可以提交页面。(这是我试图做的事情的简化版本,我会有更多的字段,而不仅仅是“名称”和“描述”) 有两种形式: 优点:我可以独立验证 缺点:controller方法只接收subited表单数据,在本例中是“personname”或“Hobby description”,这意味着我无法重新创建“PersonHobbyModel”的完整实例 这就是模型:
public class Person {
[Display(Name = "Person name:")]
[Required(ErrorMessage = "Person name required.")]
public string Name { get; set; }
}
public class Hobby {
[Display(Name = "Hobby description:")]
[Required(ErrorMessage = "Hobby description required.")]
public string Description { get; set; }
}
public class PersonHobbyModel {
public PersonHobbyModel() {
this.Person = new Person();
this.Hobby = new Hobby();
}
public Person Person { get; set; }
public Hobby Hobby { get; set; }
}
这是控制器:
public class PersonHobbyController : Controller
{
//
// GET: /PersonHobby/
public ActionResult Index()
{
var model = new PersonHobbyModel();
return View(model);
}
public ActionResult PostData(FormCollection data) {
var model = new PersonHobbyModel();
TryUpdateModel(model.Person, "Person");
TryUpdateModel(model.Hobby,"Hobby");
return View("Index", model);
}
}
这是一种观点:
@model MultipleFORMStest.PersonHobbyModel
@{
ViewBag.Title = "Index";
}
<h2>
Index</h2>
@using (Html.BeginForm("PostData", "PersonHobby")) {
<div>
@Html.LabelFor(model => model.Person.Name)
@Html.TextBoxFor(model => model.Person.Name)
@Html.ValidationMessageFor(model => model.Person.Name)
<input type="submit" value="Submit person" />
</div>
}
@using (Html.BeginForm("PostData", "PersonHobby")) {
<div>
@Html.LabelFor(model => model.Hobby.Description)
@Html.TextBoxFor(model => model.Hobby.Description)
@Html.ValidationMessageFor(model => model.Hobby.Description)
<input type="submit" value="Submit hobby" />
</div>
}
@model MultipleFORMStest.PersonHobbyModel
@{
ViewBag.Title=“Index”;
}
指数
@使用(Html.BeginForm(“PostData”、“PersonHobby”)){
@LabelFor(model=>model.Person.Name)
@Html.TextBoxFor(model=>model.Person.Name)
@Html.ValidationMessageFor(model=>model.Person.Name)
}
@使用(Html.BeginForm(“PostData”、“PersonHobby”)){
@LabelFor(model=>model.Hobby.Description)
@Html.TextBoxFor(model=>model.Hobby.Description)
@Html.ValidationMessageFor(model=>model.Hobby.Description)
}
更新1我没有提到,因为我想让问题尽可能简单,但是对于其中一个部分,我使用了“jQueryUIDialog”。我最初使用一个DIV来定义对话框,它位于我的主窗体中。这可能会导致一个问题,因为我无法在客户机上独立于表单的其余部分验证“JQuery对话框表单” 说这个jquery确实从主窗体中删除了“divjqueryui对话框”,这使我将对话框包含在它自己的窗体中。基于这个原因,我最终得到了两种形式。优点是我现在可以独立验证“jquery对话框ui表单” 但我不知道应该如何处理从客户端的各种表单提交的服务器数据,因为用户有可能禁用了JS。如果从一个表单提交,则无法访问其他表单中的数据 更新2
谢谢你的回复。我相信我确实需要两个表单和两个实体,因为我想在客户机上独立地验证它们(除了被“jQueryUI对话框”强制验证)。例如,如果我有,而不是一个爱好,我有一个爱好列表,我可以显示在同一个视图中的网格中。因此,我无法填写人名,但继续将爱好添加到网格中,如果我没有完成爱好描述,我将得到一个验证错误。(很抱歉,我应该在最初的问题中包括我的两个更新,但为了清楚起见,我想让它尽可能简单)从我的角度来看,您有一个对应于两个实体模型的单视图模型。在您的位置上,我将使用单个表单并验证视图模型,而不是将其视为两个(依赖的)实体。在操作中接收回视图模型,而不是常规表单集合,并通过数据注释属性使用基于模型的验证。一旦您拥有了一个有效的、发布的模型,您就可以将其转换为适当的实体并将其保存到数据库中 模型 控制器
public class PersonHobbyController : Controller
{
//
// GET: /PersonHobby/
[HttpGet] // mark as accepting only GET
public ActionResult Create() // Index should probably provide some summary of people and hobbies
{
var model = new PersonHobbyViewModel();
return View(model);
}
[HttpPost] // mark as accepting only POST
public ActionResult Create(PersonHobbyViewModel model) {
if (ModelState.IsValid) {
var person = new Person { Name = model.Name };
var hobby = new Hobby { Description = model.Description };
person.Hobbies = new List<Hobby> { hobby };
db.Persons.Add( person );
db.SaveChanges();
}
return RedirectToAction( "details", new { id = person.Id } ); // view the newly created entity
}
}
公共类PersonHobbyController:控制器
{
//
//获得个人爱好/
[HttpGet]//标记为仅接受GET
public ActionResult Create()//索引可能应该提供一些人和爱好的摘要
{
var模型=新的PersonHobbyViewModel();
返回视图(模型);
}
[HttpPost]//标记为仅接受POST
公共行动结果创建(PersonHobbyViewModel模型){
if(ModelState.IsValid){
var person=newperson{Name=model.Name};
var hobby=newhobby{Description=model.Description};
person.habiods=新列表{habiody};
db.Persons.Add(人);
db.SaveChanges();
}
return RedirectToAction(“details”,new{id=person.id});//查看新创建的实体
}
}
看法
@model MultipleFORMStest.PersonHobbyViewModel
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm(“创建”、“个人爱好”)){
@LabelFor(model=>model.Person.Name)
@Html.TextBoxFor(model=>model.Person.Name)
@Html.ValidationMessageFor(model=>model.Person.Name)
@LabelFor(model=>model.Hobby.Description)
@Html.TextBoxFor(model=>model.Hobby.Description)
@Html.ValidationMessageFor(model=>model.Hobby.Description)
}
从我的角度来看,您有一个对应于两个实体模型的单一视图模型。在您的位置上,我将使用单个表单并验证视图模型,而不是将其视为两个(依赖的)实体。在操作中接收回视图模型,而不是常规表单集合,并通过数据注释属性使用基于模型的验证。一旦您拥有了一个有效的、发布的模型,您就可以将其转换为适当的实体并将其保存到数据库中
模型
控制器
public class PersonHobbyController : Controller
{
//
// GET: /PersonHobby/
[HttpGet] // mark as accepting only GET
public ActionResult Create() // Index should probably provide some summary of people and hobbies
{
var model = new PersonHobbyViewModel();
return View(model);
}
[HttpPost] // mark as accepting only POST
public ActionResult Create(PersonHobbyViewModel model) {
if (ModelState.IsValid) {
var person = new Person { Name = model.Name };
var hobby = new Hobby { Description = model.Description };
person.Hobbies = new List<Hobby> { hobby };
db.Persons.Add( person );
db.SaveChanges();
}
return RedirectToAction( "details", new { id = person.Id } ); // view the newly created entity
}
}
公共类PersonHobbyController:控制器
{
//
//获得个人爱好/
[HttpGet]//标记为仅接受GET
public ActionResult Create()//索引可能应该提供
@model MultipleFORMStest.PersonHobbyViewModel
@{
ViewBag.Title = "Create";
}
<h2>
Create</h2>
@using (Html.BeginForm("Create", "PersonHobby")) {
<div>
@Html.LabelFor(model => model.Person.Name)
@Html.TextBoxFor(model => model.Person.Name)
@Html.ValidationMessageFor(model => model.Person.Name)
<input type="submit" value="Submit person" />
</div>
<div>
@Html.LabelFor(model => model.Hobby.Description)
@Html.TextBoxFor(model => model.Hobby.Description)
@Html.ValidationMessageFor(model => model.Hobby.Description)
<input type="submit" value="Submit hobby" />
</div>
}
public class AddPersonHobbyViewModel
{
[Required]
[Display (Name="Person Name")]
public string PersonName { set;get;}
[Required]
[Display (Name="Hobby Description")]
public string HobbyDescription { set;get;}
}
[HttpPost]
public ActionResult PostData(AddPersonHobbyViewModel objVM)
{
if(ModelState.IsValid)
{
// Everything is fine. Lets save and redirect to another get View( for PRG pattern)
}
return View(objVm);
}
@model AddPersonHobbyViewModel
@using (Html.BeginForm("PostData","Person"))
{
@Html.TextBoxFor(m=>m.PersonName)
@Html.ValidationMessageFor(m => m.PersonName)
@Html.TextBoxFor(m=>m.HobbyDescription )
@Html.ValidationMessageFor(m => m.HobbyDescription )
<input type="submit" value="Save" />
}