【问题标题】:Populate drop down in MVC using different View and Controller使用不同的视图和控制器填充 MVC 中的下拉列表
【发布时间】:2015-07-01 16:42:45
【问题描述】:

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

让我们看看以下内容:

引用(页)

Item (Page) - ItemDetails (Partial inside Item) - Artwork (部分内 ItemDetails)

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

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

  1. 预填充几个不同的下拉列表。 (如果有帮助,我有一些预先格式化的选择标签,我可以重复使用,用于 Angular 项目)。
  2. 如果发现附加到项目,这些下拉框应预加载任何现有值。
  3. 拥有能够更改和更新值的表单。

刚搬到 MVC 后,尽管在各种指南/教程上搜索了一天多,但我仍在努力完成它。万一您想知道我为什么要分离控制器,那是因为该项目将变得庞大。从架构上讲,这是有道理的。

示例:样机类型位于 Artwork 中。我使用了实体框架,并且成功检索了所有 MockupTypes。

第一部分:

@Html.Partial(MVC.Item.Views.ViewNames._TabbedItemDetailsPanel, Model.SelectedItem) 

SelectedItem 视图模型:

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
}

这来自一个名为 Artwork 的单独控制器。

public partial class ArtworkDetailController : Controller
{
    [HttpGet]
    public virtual ActionResult GetAttributes()
    {
        var model = new ArtworkAttributesViewModel();
        model = artworkAttributesViewModelService.GetArtworkAttributes();
        return View(model);
    }
}

在 _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>
}

总之,我有 2 个局部视图、2 个视图模型和 2 个控制器。我到底如何将所有这些整合在一起?

非常感谢。

编辑:仍在努力让第二个控制器将视图发送到部分

【问题讨论】:

标签: c# asp.net-mvc asp.net-mvc-4 model-view-controller architecture


【解决方案1】:

您可以将下拉列表绑定到要编辑的项目和要填充它的模型。

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" })

【讨论】:

  • 如何让我的视图模型调用另一个控制器以填充我的选择列表?谢谢
  • 您应该使用所需的所有列表创建一个视图模型,并将其绑定到该视图的控制器操作中的视图
  • 这不是坏习惯吗?我最终会将大约 70 个视图模型集中在一个类中,我希望有办法将它们分开?
  • 我的理解是视图模型为视图提供数据。因此视图模型。如果您有 70 个视图,我认为您将需要 70 个视图模型,除非您可以重复使用它们。可以从任何控制器调用视图模型并将其传递给任何视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多