Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建自定义Html.ControlFor?_C#_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

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的编辑器,而不是默认编辑器。也可以将编辑器视图命名为与复杂位置模型相同的名称。