C# 使用不同的视图和控制器填充MVC中的下拉列表

C# 使用不同的视图和控制器填充MVC中的下拉列表,c#,asp.net-mvc,asp.net-mvc-4,model-view-controller,architecture,C#,Asp.net Mvc,Asp.net Mvc 4,Model View Controller,Architecture,我正在创建一个内部CMS系统。我有一个页面可以检索一个项目,并允许用户执行各种管理任务 让我们看看以下内容: 报价(第页) 项目(第页)-项目详情(项目内部分)-艺术品(项目详情内部分) 用户选择一个报价。然后查看检索具有关联内容的项目的项目。在项目中,他们可以选择艺术品或任何其他选项卡(也可以选择局部视图) 然后,用户可以更改内部CMS系统的值。我想: 预先填充几个不同的下拉列表。(如果有帮助的话,我有一些预先格式化的select标记,我可以重复使用,在一个角度项目中使用过) 如果发现这些下拉

我正在创建一个内部CMS系统。我有一个页面可以检索一个项目,并允许用户执行各种管理任务

让我们看看以下内容:

报价(第页)

项目(第页)-项目详情(项目内部分)-艺术品(项目详情内部分)

用户选择一个报价。然后查看检索具有关联内容的项目的项目。在项目中,他们可以选择艺术品或任何其他选项卡(也可以选择局部视图)

然后,用户可以更改内部CMS系统的值。我想:

  • 预先填充几个不同的下拉列表。(如果有帮助的话,我有一些预先格式化的select标记,我可以重复使用,在一个角度项目中使用过)
  • 如果发现这些下拉框附加到项目,则应使用任何现有值预加载这些下拉框
  • 拥有一个能够更改和更新值的表单
  • 刚搬到MVC,尽管我花了一天多的时间阅读各种指南/教程,但我还是很难搞定它。万一你想知道我为什么要分离控制器,那是因为这个项目将变得庞大。从架构上讲,这是有道理的

    示例:模型类型在Artwork中。我已经使用了实体框架,并且成功地检索了我所有的模拟类型

    第一部分:

    @Html.Partial(MVC.Item.Views.ViewNames._TabbedItemDetailsPanel, Model.SelectedItem) 
    
    选择EdItem viewModel:

    public class SelectedItem
    {
        public ArtworkDetailViewModel ArtworkDetail { get; set; }
        //Several others
    }
    
    ArtworkDetail包含:

    public class ArtworkDetailViewModel : DataViewModel
    {
        public int? ItemID { get; set; }
        public FaceColourViewModel FaceColour { get; set; }
        public MockupTypeViewModel MockupType { get; set; }
        public ProofingTypeViewModel ProofType { get; set; }
        //Others
    }
    
    这是由项目控制器引入的:

    public partial class ItemController : Controller
    {
        public virtual ActionResult ItemDetail(int itemId)
        {
            var model = new QuotePageViewModel();
            var item = itemViewModelService.GetItemByID(itemId);
            model.LiveQuotes = quotesOverviewViewModelService.GetItemsByQuote(item.QuoteID.Value);
            model.SelectedItem = item;
            return View(model);
        }
    }
    
    在上面发布的部分视图中,我有一个Artwork选项卡,这是另一个单独的部分视图:

     @Html.Partial(MVC.Item.Views._TabbedArtwork, new ViewModels.Artwork.ArtworkAttributesViewModel())
     
    
    我的想法是ArtworkAttributesViewModel将有一个预填充模型的列表

    public class ArtworkAttributesViewModel
    {
        public IEnumerable<ProofingTypeViewModel> ProofTypes { get; set; }
        public IEnumerable<MockupTypeViewModel> MockupTypes { get; set; }
        //Others
    }
    
    在TabbedArtwork中,我开始创建一个表单:

    @model  ViewModels.Artwork.ArtworkAttributesViewModel
    
    @using (Html.BeginForm(MVC.ArtworkDetail.ActionNames.Index, MVC.ArtworkDetail.Name, FormMethod.Get))
    {
        <div class="row">
            <div class="col-md-12">
                <p><strong></strong> <br />
            </div>
            <div class="col-md-12">
                <div class="row show-grid">
                <p class="margin-bottom-zero"><strong>Mockup Types</strong></p>
                    <div class="col-md-3 col-xs-12">
                        @Html.DropDownListFor()
                        <select class="selectpicker"></select>
                    </div>
                </div>
            </div>
        </div>
    }
    
    @model ViewModels.Artwork.ArtworkAttributes视图模型
    @使用(Html.BeginForm(MVC.ArtworkDetail.ActionNames.Index、MVC.ArtworkDetail.Name、FormMethod.Get))
    {
    

    模型类型

    @Html.DropDownListFor() }
    总之,我有2个部分、2个视图模型和2个控制器。我究竟该如何把这一切结合起来

    非常感谢


    编辑:仍在努力让第二个控制器将视图发送到局部视图。您可以将下拉列表绑定到要编辑的项目以及填充它的模型

    public class mainitem() {
        public int id { get; set; }
        public int type { get; set; }
    }
    
    public class type() {
        public int id { get; set; }
        public string name { get; set; }
    }
    
    public class myviewmodel() {
        public mainitem item { get; set; }
        public List<type> types { get; set; }
    }
    
    @Html.DropDownListFor(x => x.item.type, 
               new SelectList(Model.types, "id", "name"), "-Select-", 
               new { @class = "form-control" })
    
    public类mainitem(){
    公共int id{get;set;}
    公共int类型{get;set;}
    }
    公共类类型(){
    公共int id{get;set;}
    公共字符串名称{get;set;}
    }
    公共类myviewmodel(){
    公共mainitem项{get;set;}
    公共列表类型{get;set;}
    }
    @Html.DropDownListFor(x=>x.item.type,
    新建选择列表(Model.types,“id”,“name”),“-Select-”,
    新的{@class=“表单控制”})
    
    如何让我的viewmodel调用其他控制器来填充我的selectlist?谢谢,您应该创建一个包含所有所需列表的viewmodel,并将其绑定到该视图的控制器操作中的视图,这不是一种糟糕的做法吗?最后,我将在一个类中集中大约70个viewmodel,我希望有一种方法将它们分离出来?我的理解是viewmodel为视图提供数据。因此,视图模型。如果您有70个视图,我假设您需要70个视图模型,除非您可以重复使用它们。可以从任何控制器调用viewmodel并将其传递到任何视图。请参见我的答案。将类更改为不同控制器上该类的路径,它应该适合您
    public class mainitem() {
        public int id { get; set; }
        public int type { get; set; }
    }
    
    public class type() {
        public int id { get; set; }
        public string name { get; set; }
    }
    
    public class myviewmodel() {
        public mainitem item { get; set; }
        public List<type> types { get; set; }
    }
    
    @Html.DropDownListFor(x => x.item.type, 
               new SelectList(Model.types, "id", "name"), "-Select-", 
               new { @class = "form-control" })