• 将数据传递给查看使用动作C#的MVC

  • 本文关于 c#,asp.net-mvc,asp.net-mvc-4,razor
  • CodeGo.net > 将数据传递给查看使用动作C#的MVC
  •  

    将数据传递给查看使用动作C#的MVC



    c# asp.net-mvc asp.net-mvc-4 razor
    我目前工作的一个项目中,我们有一些类似的机型。我让他们都来自基本模型继承,我们也做了控制器(基本的东西,如列表,添加,编辑等),工程处理示范base。它的实际工作和事情变得简单 CodeGo.net,但我有小问题,下拉菜单。 没有进入太多细节,它会使事情真的很简单,如果我可以从控制器传递数据的操作。像这样:
    @Html.DropDownListFor(model => model.Xtypechild, Action("GetList", "XController"))
    
    行动在哪里GetList回报IEnumerable<SelectListItem>这样我可以写代码只是这一次为多个不同的控制器。 我知道这听起来很疯狂,但如果我的更传统的方式来做到这一点我将结束与冗余代码,并再次将失去我们继承控制器所具备的优势之一。 我可以看到现在唯一的选择就是让GetList返回JSON的所有项目,并填充的Ajax / JS。我也能有这样返回一个包含下拉的局部视图的操作,但我不知道这是一个好主意。 谢谢你远远的所有输入。最后我去了以下解决方案: 我们有一个服务类用于处理数据库操作为我们的模型。我只想补充一点,生成一个IEnumerable<SelectListItem>以基本服务类。现在,我通过项目通过ViewBag下拉菜单(尽管它投他们回到在视图中)。我将它们分配给ViewBag在继承了控制器的重载构造函数。 我最好的咨询代码的原作者,如果这个解决方案将确定为我们的项目,虽然他是在度假,现在。对于现在这个将不得不这样做。在向上的一面产生很少的代码,所以它应该很容易更换(如果我必须这样做)。 该代码进化一点点,现在我有这样的观点(注意int?铸造是有属性是int类型,它是行不通的除外):
    Html.DropDownListFor(
      model => model.XId, 
      new SelectList((List<X>)ViewBag.Xs, "Id", "Name", (Model != null ? (int?)Model.XId : null)),
       " -- select -- ",
       null)
    
    而像控制器重载的构造函数这里面:
    ViewBag.Xs = db.Xs.ToList();
    
    这是definitelly不要在razor下拉菜单的最佳途径,但它是对他们最好的方式在项目中。这样做的原因是:没有做的ViewModels和重写基控制器的所有行动,以处理它们(以及提供数据在这些行动的下拉菜单)。 该代码甚至进一步发展。这当然不是一个好主意,在控制器的构造函数执行查询,如果数据只是在极少数的views。所以,现在的构造函数中包含相当于:
    ViewBag.Xs = (IQueryable<X>)db.Xs;
    
    并认为:
    Html.DropDownListFor(
      model => model.XId, 
      new SelectList((IQueryable<X>)ViewBag.Xs, "Id", "Name", (Model != null ? (int?)Model.XId : null)),
       " -- select -- ",
       null)
    
    这种方法只执行查询时视图实际需要的数据。
    本文地址 :CodeGo.net/1106261/
    -------------------------------------------------------------------------------------------------------------------------
    1.为下拉列表中的项目一定要在你的ViewModel。我不认为这是错误的,在派生的ViewModels创建选择列表。这似乎是重复的代码,但至少很清楚你做什么。你可以在你的base控制器,它需要映射实体的照顾创造好的帮手SelectListItem秒。 如果你真的想要一个通用的解决方案,您可以让您的基本模型:
    public class BaseViewModel
    {
     // Other properties..
     public IEnumerable<SelectListItem> GetListFromAction(string actionName, string controllerName)
     {
      // return the select list from the action.
     }
    }
    
    DropDownListFor()
    @Html.DropDownListFor(model => model.Xtypechild, Model.GetListFromAction("GetList", "XController"))
    

    2.
    public ActionResult Index()
    {
     var directors = new Collection
      {
       new Director {Id = 1, Name = "David O. Russell"},
       new Director {Id = 2, Name = "Steven Spielberg"},
       new Director {Id = 3, Name = "Ben Affleck"}
      };
     var selectList = new SelectList(directors, "Id", "Name");
     var vm = new ViewModel {DirectorSelectList = selectList};
     return View(vm);
    }
    
    @Html.DropDownListFor(viewModel => viewModel.DirectorId, directorList)
    
    如果你想检查的例子,请输入链接。
    
    3. 我有一个BaseController继承自Controller再比如GenerateStateOptionsBaseController。 它可能看起来像这样:
    public IEnumerable<SelectListItem> GenerateStateOptions()
    {
     var items = new List<SelectListItem>();
     var states = New List<State>(); // get states from your DB or wherever
     foreach(var state in states)
     {
      items.Add(new SelectListItem()); // set your properties for the SLI
     }
     return items;
    }
    
    然后在你的控制器,你可以这样做:
    ... // additional ActionMethod code here
    model.States = GenerateStateOptions();
    

    4. 我当然不具有对视图模型来填充同意SelectList CodeGo.net,即使它被呼叫控制器。其中的原因很简单:它是控制器的责任来填充一个模式,而不是周围的其他方式。 处理这种情况最好的方法是让你的控制器上,可以为你构建列表。因为它是一个任务,那意味着多个控制器需要访问该函数,并因此创建你自己的BaseController所有控制器的派生,是要走的路。 考虑到这一点,这里有一个BaseController用我写了构建任何SelectList: 的BaseController:
    public class BaseController : Controller
    {
     [NonAction]
     public SelectList BuildSelectList<TSource>(IEnumerable<TSource> source,
      Expression<Func<TSource, int>> valueKey, Expression<Func<TSource, string>> textKey,
      object selectedValue = null)
     {
      var selectedValueKey = ((MemberExpression)(MemberExpression)valueKey.Body).Member.Name;
      var selectedTextKey = ((MemberExpression)(MemberExpression)textKey.Body).Member.Name;
      return new SelectList(source, selectedValueKey, selectedTextKey, selectedValue);
     }
    }
    
    注意的NonActionAttribute标志着这可以防止被援引为一个动作。下面是如何这样一个简单的例子。 StudentViewModel:
    public class StudentViewModel
    {
     public int Id { get; set; }
     public string Name { get; set; }
     [Display(Name = "Course")]
     public int CourseId { get; set; }
     public SelectList Courses { get; set; }
    }
    
    CourseId代表所选择的课程。 课程:
    public class Course
    {
     public int Id { get; set; }
     public string Name { get; set; }
    }
    
    // Notice how we're deriving from BaseController
    public class HomeController : BaseController
    {
     public ActionResult Index()
     {
      var model = new StudentViewModel();
      model.Id = 1;
      model.Name = "John";
      model.Courses = BuildSelectList(this.courses,
              m => m.Id, m => m.Name);
      return View(model);
     }
     [HttpPost]
     public ActionResult Index(StudentViewModel model)
     {
      if (ModelState.IsValid)
      {
       return RedirectToAction("Success");
      }
      // The model wasn't valid, so repopulate the dropdown
      model.Courses = BuildSelectList(this.courses, m => m.Id,
              m => m.Name, model.CourseId);
      return View(model);
     }
    }
    
    然后你会显示在下拉在你看来像这样:
    @Html.DropDownListFor(m => m.CourseId, Model.Courses)
    

    本文标题 :将数据传递给查看使用动作C#的MVC
    本文地址 :CodeGo.net/1106261/
    1. 求一个匹配URL的表达式,包括hppt和ftp的?
    2. 如何FUNC的属性Target <>设置?
    3. 請教大俠:怎麼樣在我們方本框中輸入這個格式“00.00%”
    4. 检测粗体,下划线在word文档中的文字和标题用C#SDK OPENXML
    5. 如何让OleDbDataAdapter一次执行2条sql语句
    6. 设置一个窗口,一次只能打开,除非需要
    7. 向教窗体隐藏和退出问题
    8. 如何找到客户端谁是登录我们的网站或浏览我们的网站的ip地址
    9. 转换段代码!
    10. 在指定范围内将随机字节整数

     
    

    Copyright © 2017 CodeGo.net
    http://codego.net/xinwen/ 足球比分网 足球比分 医药招商网 邵阳县新闻