如何根据调用它的视图配置 MVC 下拉列表

How to configure an MVC dropdown depending on which view calls it

我有两个视图,BatchReceipt 和 Receipt,它们使用相同的模型。到目前为止,他们一直使用相同的 ReceiptType 显示模板。但我想让一个排除某些项目,另一个排除完整列表(因此本质上是第二个 .cshtml 显示模板,称为 ReceiptTypeFull)。如何配置 Visual Studio 中的每个视图以利用不同的显示模板?

显示正在使用的代码的一些补充:

我将文件 ReceiptType.cshtml 用作 DisplayTemplate,其中包含用于设置收据下拉列表的以下内容

@using Clinton.Web.Helpers.EnumHelpers
@{
    var item = EnumsHelper.GetNameFromEnumValue(Model);
 }

我想使用不同的 DisplayTemplate,将其命名为 ReceiptTypeFull.cshtml

@using Clinton.Web.Helpers.EnumHelpersFull
@{
    var item = EnumsHelper.GetNameFromEnumValue(Model);
 }
@item

区别在于调用 enumhelper 或 enumhelperfull 来改变填充下拉列表的查询。我的问题是我看不到如何重定向视图以使用不同的 enumhelper/displaytemplate/

谢谢

我想我明白你的意思了。您想要控制哪个模板用于视图中的枚举。

我将解释如何使用编辑器模板,但如果您使用显示模板,它的工作方式相同。您应该能够关注并申请您的场景。

想法是使用编辑器 html 帮助程序的重载。

public static MvcHtmlString Editor(this HtmlHelper html, string expression, string templateName);

是这样叫的

@Html.Editor("{property name}", "{template name}").

下面是一个例子来展示它的使用。

假设我们有这个枚举

public enum MyItems
{

    Item1 = 1,
    Item2 = 2,
    Item3 = 3  
}

这个帮手

public static class MyEnumHelper
{
    public static List<MyItems> GetAllItems()
    {
         return new List<MyItems>()
         {
              MyItems.Item1,
              MyItems.Item2,
              MyItems.Item3
          };
     }

      public static List<MyItems> GetSomeItems()
      {
          return new List<MyItems>()
          {
              MyItems.Item1,
              MyItems.Item2                
           };
      }
}

这个控制器

public class HomeController : Controller
{      
    public ActionResult AllItems()
    {
        return View();
    }

    public ActionResult SomeItems()
    {
        return View();
    }
}

我们有这2个编辑器模板,放在views/shared/editortemplates

第一个叫 MyItems.cshtml 就是全部

@model MyItems?

 @{
  var values = MyEnumHelper.GetAllItems().Cast<object>()
      .Select(v => new SelectListItem
      {
         Selected = v.Equals(Model),
         Text = v.ToString(),
         Value = v.ToString()
       });
   }

@Html.DropDownList("", values)  

第二个叫MyItems2.cshtml,也就是第一个

@model MyItems?

@{
    var values = MyEnumHelper.GetSomeItems().Cast<object>()
        .Select(v => new SelectListItem
        {
            Selected = v.Equals(Model),
            Text = v.ToString(),
            Value = v.ToString()
        });
}

@Html.DropDownList("", values)  

然后在AllItems.cshtml中获取我们需要的MyItems.cshtml模板调用

@model MyItemsViewModel  

@using (Html.BeginForm())
{    
    @Html.EditorFor(x => x.MyItem)    
    <submit typeof="submit" value="submit"/>
}

并且在 SomeItems.cshtml 中通过调用 MyItems2.cshtml 获取一些项目我们使用

@model MyItemsViewModel

@using (Html.BeginForm())
{    
    @Html.Editor("MyItem", "MyItems2")   @* this bit answers your question *@
    <submit typeof="submit" value="submit" />
}