如何根据调用它的视图配置 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" />
}
我有两个视图,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" />
}