C# 如何在ASP.net MVC 3中提交时更新当前视图中的文本区域?

C# 如何在ASP.net MVC 3中提交时更新当前视图中的文本区域?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我有一个有两个下拉列表的页面,根据这两个列表的选择,我想在提交按钮上用一些数据填充文本区域 我在调试时看到的行为是,呈现页面时,我进行选择并按submit。DataAccess返回正确的结果,视图返回正确的结果,但有一个例外:“没有类型为'IEnumerable'的ViewData项具有键'People' 我可以看到我可以重新设置下拉列表,但感觉我做得不对。在MVC 3中有没有其他方法来执行这种操作 public ActionResult Test() { //Peop

我有一个有两个下拉列表的页面,根据这两个列表的选择,我想在提交按钮上用一些数据填充文本区域

我在调试时看到的行为是,呈现页面时,我进行选择并按submit。DataAccess返回正确的结果,视图返回正确的结果,但有一个例外:“没有类型为'IEnumerable'的ViewData项具有键'People'

我可以看到我可以重新设置下拉列表,但感觉我做得不对。在MVC 3中有没有其他方法来执行这种操作

 public ActionResult Test()
    {
        //People for dropdownlist 1
        var db = peopleRepository.People;
        var query = db.Select(c => new {c.Id, c.Name});
        ViewBag.People = new SelectList(query.AsEnumerable(), "Id", "Name");

        //Elements for dropdownlist 2
        var list = new Dictionary<string, string> {{"1", "Name"}, {"2", "Address"}, {"3", "Zip"}};
        ViewBag.Elements = new SelectList(list, "Key", "Value");

        return View();
    }

 // This part is what I'm confused about.
[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Test(string people, string elements)
    {
        if (ModelState.IsValid)
        {
            // Output from persistent storage query
            var da = new DatabaseAccess(people, elements);
            ViewBag.Results = da.Execute();

        }
        return View();
    }
{ @DropDownList(“People”,(SelectList)ViewBag.People,“--Select One--”) @DropDownList(“Elements”,(SelectList)ViewBag.Elements,“--Select One--”) @TextArea(“Results”,(string)ViewBag.Results,10120,”) }


以下是我将如何快速构建它:

型号:

   public class People
   {
      public int Id { get; set; }
      public string Name { get; set; }
   }
ViewModel(视图所需的所有内容):

控制器(使用索引作为默认操作,为视图模型创建一个可以调整的init函数)以适应任何更合适的操作:

public class HomeController : Controller
   {

      private static TestViewModel InitTestVM()
      {
         //People for dropdownlist 1
         var db = new List<People>();//peopleRepository.People;
         db.Add(new People { Id = 1, Name = "Name 1" });
         db.Add(new People { Id = 2, Name = "Name 2" });
         var query = db.Select(c => new { c.Id, c.Name });

         //Elements for dropdownlist 2
         var list = new Dictionary<string, string> { { "1", "Name" }, { "2", "Address" }, { "3", "Zip" } };


         TestViewModel testVM = new TestViewModel
         {
            People = new SelectList(query.AsEnumerable(), "Id", "Name"),
            Elements = new SelectList(list, "Key", "Value")
         };
         return testVM;
      }

      public ActionResult Index()
      {
         return View(InitTestVM());
      }

      // This part is what I'm confused about.
      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Index(TestViewModel testVM)
      {
         var vm = InitTestVM();
         if (ModelState.IsValid && testVM != null)
         {
            ModelState.Clear();
            // Output from persistent storage query
            //var da = new DatabaseAccess(people, elements);
            vm.Results = "sfdfsdfsdfsdfsdfsdfsdfsdf";//da.Execute();
            vm.SelectedElementId = testVM.SelectedElementId;
            vm.SelectedPeopleId = testVM.SelectedPeopleId;
            return View(vm);
         }
         return View(vm);
      }
   }
公共类HomeController:控制器
{
私有静态TestViewModel InitTestVM()
{
//下拉列表1的人
var db=new List();//peopleRepository.People;
db.Add(新人物{Id=1,Name=“Name 1”});
db.Add(新人物{Id=2,Name=“Name 2”});
var query=db.Select(c=>new{c.Id,c.Name});
//dropdownlist 2的元素
var list=新字典{{“1”,“Name”},{“2”,“Address”},{“3”,“Zip”};
TestViewModel testVM=新的TestViewModel
{
People=新建SelectList(query.AsEnumerable(),“Id”,“Name”),
元素=新的选择列表(列表,“键”、“值”)
};
返回testVM;
}
公共行动结果索引()
{
返回视图(InitTestVM());
}
//这部分是我困惑的地方。
[接受动词(HttpVerbs.Post)]
公共操作结果索引(TestViewModel testVM)
{
var vm=InitTestVM();
if(ModelState.IsValid&&testVM!=null)
{
ModelState.Clear();
//持久存储查询的输出
//var da=新数据库访问(人员、元素);
vm.Results=“sfdfsdf”//da.Execute();
vm.SelectedElementId=testVM.SelectedElementId;
vm.SelectedPeopleId=testVM.SelectedPeopleId;
返回视图(vm);
}
返回视图(vm);
}
}
最后一个观点是:

@model ViewModels.TestViewModel

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{ 
   @Html.DropDownListFor(m => m.SelectedPeopleId, Model.People, "--Select One--") 
   @Html.DropDownListFor(m => m.SelectedElementId, Model.Elements, "--Select One--") 
   @Html.TextAreaFor(m => m.Results, 10, 120, "") 
   <input type="submit" value="Test" />
}
@model ViewModels.TestViewModel
@使用(Html.BeginForm(“Index”,“Home”,FormMethod.Post))
{ 
@Html.DropDownListFor(m=>m.SelectedPeopleId,Model.People,“--selectone--”)
@Html.DropDownListFor(m=>m.SelectedElementId,Model.Elements,“--selectone--”)
@TextAreaFor(m=>m.Results,10120,“”)
}

使用模型会更容易,请参见以下问题作为示例:@Matthieu-这很好,但我仍然不确定post部分。这确实有帮助,我遇到的一个问题是:“没有为该对象定义无参数构造函数。”异常是引发post操作。只是我上面的一个输入错误^帮助。
public class HomeController : Controller
   {

      private static TestViewModel InitTestVM()
      {
         //People for dropdownlist 1
         var db = new List<People>();//peopleRepository.People;
         db.Add(new People { Id = 1, Name = "Name 1" });
         db.Add(new People { Id = 2, Name = "Name 2" });
         var query = db.Select(c => new { c.Id, c.Name });

         //Elements for dropdownlist 2
         var list = new Dictionary<string, string> { { "1", "Name" }, { "2", "Address" }, { "3", "Zip" } };


         TestViewModel testVM = new TestViewModel
         {
            People = new SelectList(query.AsEnumerable(), "Id", "Name"),
            Elements = new SelectList(list, "Key", "Value")
         };
         return testVM;
      }

      public ActionResult Index()
      {
         return View(InitTestVM());
      }

      // This part is what I'm confused about.
      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Index(TestViewModel testVM)
      {
         var vm = InitTestVM();
         if (ModelState.IsValid && testVM != null)
         {
            ModelState.Clear();
            // Output from persistent storage query
            //var da = new DatabaseAccess(people, elements);
            vm.Results = "sfdfsdfsdfsdfsdfsdfsdfsdf";//da.Execute();
            vm.SelectedElementId = testVM.SelectedElementId;
            vm.SelectedPeopleId = testVM.SelectedPeopleId;
            return View(vm);
         }
         return View(vm);
      }
   }
@model ViewModels.TestViewModel

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{ 
   @Html.DropDownListFor(m => m.SelectedPeopleId, Model.People, "--Select One--") 
   @Html.DropDownListFor(m => m.SelectedElementId, Model.Elements, "--Select One--") 
   @Html.TextAreaFor(m => m.Results, 10, 120, "") 
   <input type="submit" value="Test" />
}