C# 如何创建自定义Html.ControlFor?
我有一个名为C# 如何创建自定义Html.ControlFor?,c#,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,我有一个名为Entity public class Entity { public string Name { get; set; } public Location Place { get; set; } } 还有一个类叫做Location public class Location { public string Country { get; set; } public string State { get; set; } public str
Entity
public class Entity
{
public string Name { get; set; }
public Location Place { get; set; }
}
还有一个类叫做Location
public class Location
{
public string Country { get; set; }
public string State { get; set; }
public string City { get; set; }
}
一个实体
包含一个位置
,因此我想为位置
生成3个下拉列表
- 国家
- 陈述
- 城市
@Html.DropDownListFor(o => o.Country, new [] { new SelectListItem() { Text = "United States", Value="US" } })
<br />
@Html.DropDownListFor(o => o.State, new [] { new SelectListItem() { Text = "Some State", Value="SS" } })
<br />
@Html.DropDownListFor(o => o.City, new[] { new SelectListItem() { Text = "Some city", Value = "City" } })
部分观点是
@model TestMVC3Razor.Controllers.Location
@using (Html.BeginForm())
{
@Html.DropDownListFor(o => o.Country, new [] { new SelectListItem() { Text = "United States", Value="US" } })
<br />
@Html.DropDownListFor(o => o.State, new [] { new SelectListItem() { Text = "Some State", Value="SS" } })
<br />
@Html.DropDownListFor(o => o.City, new[] { new SelectListItem() { Text = "Some city", Value = "City" } })
}
但是我该怎么做呢?我需要生成3个下拉列表
,当我发布到一个动作时,我需要获取具有bidden值的对象
public ActionResult(Location loc)
{
var x = String.Format("{0}, {1} - {2}", loc.City, loc.Country, loc.State);
}
当我发布时,如何使此帮助程序创建3个下拉列表和绑定值
public static HtmlHelperExtensions {
public static MvcString LocationSelectFor<TModel, TProperty>(this HtmlHelper<TModel> helper, System.Linq.Expressions.Expression<Func<TModel,TProperty>> expression) {
// examine expression and build html
}
}
公共静态HtmlHelperExtensions{
public static MvcString LocationSelectFor(此HtmlHelper帮助程序,System.Linq.Expressions.Expression){
//检查表达式并构建html
}
}
诀窍是看表情。这篇博客文章应该让你开始:
或者,您可以为Location类创建EditorTemplate。只需谷歌的asp.NETMVC编辑器模板
就我个人而言,我会坚持使用EditorTemplates,因为您通常无需重新编译即可更改视图。只需使用HtmlHelper创建您自己的扩展:
public static HtmlHelperExtensions {
public static MvcString LocationSelectFor<TModel, TProperty>(this HtmlHelper<TModel> helper, System.Linq.Expressions.Expression<Func<TModel,TProperty>> expression) {
// examine expression and build html
}
}
公共静态HtmlHelperExtensions{
public static MvcString LocationSelectFor(此HtmlHelper帮助程序,System.Linq.Expressions.Expression){
//检查表达式并构建html
}
}
诀窍是看表情。这篇博客文章应该让你开始:
或者,您可以为Location类创建EditorTemplate。只需谷歌的asp.NETMVC编辑器模板
就我个人而言,我会坚持使用EditorTemplates,因为您通常无需重新编译即可更改视图。您可以按照此示例使用expression和expression body
或者只需使用字符串表达式并在此处进行操作您可以按照此示例使用表达式和表达式体
或者只是使用字符串表达式并在这里操作它根据xixonia的一些提示,我得到了我需要的东西
@Html.EditorFor(o => o.Place, "LocationSelector",
new CreateLocation{ Country = "US", State = "A", City = "Y" })
我有一个模板在下面
Views
|- Shared
|- EditorTemplates
LocationSelector.cshtml
@model TestMVC3Razor.Controllers.CreateLocation
@using TestMVC3Razor.Controllers
@Html.DropDownListFor(o => o.Country, Model.CountryList)
<br />
@Html.DropDownListFor(o => o.State, Model.StateList)
<br />
@Html.DropDownListFor(o => o.City, Model.CityList)
我不知道这是否是最好的解决方案,但至少我可以打电话
@Html.EditorFor(o => o.Place, "LocationSelector", obj)
在我的网站上有一个默认的地点选择器。根据xixonia的一些提示,我得到了我所需要的
@Html.EditorFor(o => o.Place, "LocationSelector",
new CreateLocation{ Country = "US", State = "A", City = "Y" })
我有一个模板在下面
Views
|- Shared
|- EditorTemplates
LocationSelector.cshtml
@model TestMVC3Razor.Controllers.CreateLocation
@using TestMVC3Razor.Controllers
@Html.DropDownListFor(o => o.Country, Model.CountryList)
<br />
@Html.DropDownListFor(o => o.State, Model.StateList)
<br />
@Html.DropDownListFor(o => o.City, Model.CityList)
我不知道这是否是最好的解决方案,但至少我可以打电话
@Html.EditorFor(o => o.Place, "LocationSelector", obj)
在我的网站上有一个默认的位置选择器。
//检查表达式并构建html
这实际上是我的问题。添加了一个关于使用表达式代替反射的博客文章链接。这就是你需要做的。//检查表达式并构建html
这实际上是我的问题。添加了一个关于使用表达式代替反射的博客文章的链接。这就是您需要做的。我现在没有时间讨论如何做,但是创建一个自定义编辑器,接受包含三个字符串的复杂“location”值,然后使用UIHint属性,您仍然可以使用“EditorFor(…)”,但是,的编辑器将使用给定UIHint的编辑器,而不是默认编辑器。或者您可以将编辑器视图命名为与复杂位置模型相同的名称。我现在没有时间讨论如何执行此操作,但创建一个接受包含三个字符串的复杂“位置”值的自定义编辑器可能是值得的,然后使用UIHint属性,您仍然可以使用“EditorFor(…)”,但是,的编辑器将使用给定UIHint的编辑器,而不是默认编辑器。也可以将编辑器视图命名为与复杂位置模型相同的名称。