在ASP.net MVC加载相关的数据 [英] Loading related data in ASP.net MVC

查看:100
本文介绍了在ASP.net MVC加载相关的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

很简单的东西,但我正在寻找做到这一点的最好办法。我有一个电影的实体,每个电影可以在一个只有语言(英语,法语等..一个查找表)。现在,我试图加载所有可用的语言在影片中查找创建页,电影视图模型:

Something very simple but I am looking for the best way to do it. I have a Movie entity, each Movie can be in one Language only(a lookup table with English, French,etc...). Now I'm trying to load all the available languages in the lookup in the Movie Create Page, the Movie View Model:

namespace Project.ViewModels {
    public class Movie {

        [Key]
        public int ID { get; set; }

        public string Title { get; set; }

        public string Rating { get; set; }
        public string Director { get; set; }
        public string Plot { get; set; }
        public string Link { get; set; }
        public string Starring { get; set; }
        public int DateCreated { get; set; }

        public string Genre { get; set; }

        [Display(Name = "Language")]
        public int LanguageID { get; set; }

        // Navigational Properties
        public virtual MovieLanguage Language { get; set; }
    }
}

该MovieLanguage视图模型:

The MovieLanguage View model:

namespace MAKANI.ViewModels {
    public class MovieLanguage {

        [Key]
        public int ID { get; set; }

        public string Language { get; set; }

        public virtual ICollection<Movie> Movies { get; set; }
    }
}

控制器动作:

public ActionResult MovieCreate() {


    using (MAKANI.Models.Entities db = new MAKANI.Models.Entities()) {

        List<Models.MoviesLanguages> enLanguages = db.MoviesLanguages.ToList();

        IEnumerable<SelectListItem> selectList =
                   from m in enLanguages
                   select new SelectListItem {                              
                       Text = m.Language,
                       Value = m.ID.ToString()
                   };
        ViewBag.SelectLanguage = selectList.ToList();

        return View();
    }          
}

而在View页面我有

And in the View page i have

    <div class="editor-field">
        @Html.DropDownList("Language", ViewBag.SelectLanguage);            
    </div>

Howver我在查看收到此错误:
System.Web.Mvc.HtmlHelper'中有一个名为没有适用的方法DropDownList的,但似乎有这个名字的扩展方法。扩展方法不能进行动态调度。考虑强制转换动态参数或调用扩展方法没有扩展方法的语法

不知道是什么问题呢?

对于这种方法的另一个问题:

Another questions regarding this approach:


  • 如果一个创建摆在首位的MovieLanguage实体视图模型,知道它的服务器只是作为一个查找表(所以它不要求任何创建/编辑/删除动作,只列出/读取可能),我应该根据不同的EF实体直接在这种情况下?

推荐答案

有一个语言集合属性在电影视图模型和SelectedLanguage属性来获取所选择的语言ID当表单提交。这是没有必要,你的视图模型应该有一个像你的领域模型的所有属性。 只有那些视图需要的属性。

Have a Languages Collection Property in your Movie ViewModel and a SelectedLanguage Property to get the selected Language ID when the form submits. It is not necessary that your ViewModel should have all the properties like your domain model. Have only those properties which the View needs.

public class Movie 
{
  public int ID { set;get;}
  public string Title { set;get;}
  //Other Relevant Properties also.

  public IEnumerable<SelectListItem> Languages { set;get;}
  public int SelectedLanguage { set;get;}

  public Movie()
  {
     Languages =new List<SelectListItem>();
  }
}

现在在你的 GET 动作,创建电影的对象视图模型,并设置语言集合属性和发送即到视图。尽量避免使用ViewBag传递数据是这样的。 ViewBag 使我们的code dirty.Why不​​要使用强类型的ViewModels充分发挥其程度?

Now in your GET Action, Create an object of your Movie ViewModel and set the Languages Collection property and send that to the View. Try to avoid using ViewBag for passing data like this. ViewBag makes our code dirty.Why not use the strongly typed ViewModels to its full extent ?

public ActionResult CreateMovie()
{
  var vm=new Movie();    

  // TO DO : I recommend you to abstract code to get the languages from DB 
  //         to a different method so that your action methods will be
  //         skinny and that method can be called in different places.
  var enLanguages = db.MoviesLanguages.ToList();
  vm.Languages= = from m in enLanguages
               select new SelectListItem {                              
                   Text = m.Language,
                   Value = m.ID.ToString()
               };

  return View(vm);
}

和在你看来这是强类型为我们的电影视图模型,使用DropDownListFor Hemml helper方法

And in your view which is strongly typed to our Movie ViewModel, use the DropDownListFor Hemml helper method

@model Movie
@using(Html.Beginform())
{
    @Html.DropDownListFor(x => x.SelectedLanguage, 
            new SelectList(Model.Languages, "Value", "Text"), "Select Language")
   <input type="submit" />
}

现在,当您发布的形式,你会得到您的视图模型的 SelectedLanguage 属性选定languageId

Now when you post the form, you will get the selected languageId in the SelectedLanguage Property of your ViewModel

[HttpPost]
public ActionResult CreateMovie(Movie model)
{
   If(ModelState.IsValid)
   {
       //check model.SelectedLanguage property here.
      //Save and Redirect (PRG pattern)
   }
   //you need to reload the languages here again because HTTP is stateless. 
   return View(model);
}

这篇关于在ASP.net MVC加载相关的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆