Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该如何验证MVC3页面的不同部分_C#_Asp.net Mvc 3_Validation - Fatal编程技术网

C# 我应该如何验证MVC3页面的不同部分

C# 我应该如何验证MVC3页面的不同部分,c#,asp.net-mvc-3,validation,C#,Asp.net Mvc 3,Validation,我试图理解我应该如何独立地在MVC3页面的客户机部分进行验证,并提出了我试图实现的一个简化版本 如果我使用一种形式: 优点:当我提交回“PostData”控制器方法时,我收到表单中包含的所有数据。在本例中,两个值都是“name”和“description”,这意味着我可以实例化“PersonHobbyModel”并分配我收到的数据。我可以存储在数据库中,也可以返回相同的视图 缺点:我无法独立验证。因此,如果“名称”未完成,而我完成了“描述”,我仍然可以提交页面。(这是我试图做的事情的简化版本,我

我试图理解我应该如何独立地在MVC3页面的客户机部分进行验证,并提出了我试图实现的一个简化版本

如果我使用一种形式:
优点:当我提交回“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" />
}