链接编辑器模板到TextBox

时间:2012-08-14 22:11:50

标签: c# jquery asp.net-mvc-3

我有以下情况。

我正在开发一个MVC 3 asp.net应用程序。我想用日期时间范围过滤器制作一个searh表单。我想使用日期选择器,以便用户可以选择日期范围。 我已经按照这个mvc教程

http://www.asp.net/mvc/tutorials/javascript/using-the-html5-and-jquery-ui-datepicker-popup-calendar-with-aspnet-mvc/using-the-html5-and-jquery-ui-datepicker-popup-calendar-with-aspnet-mvc-part-4

我的问题是我无法将编辑器模板链接到非模型@editotfor或输入或@textbox,我会提供一些代码,以便你明白我的观点。

我的共享文件夹(文件Date.cshtml)中有以下EditorTemplate

@model DateTime 使用日期模板 @ Html.TextBox(“”,String.Format(“{0:d}”,Model.ToShortDateString()),   新{@class =“datefield”,type =“date”})

如果我在我的视图中使用此行,一切正常

@ Html.EditorFor(m => m.fecha_Modificacion,“Date”)

但是我想在NON模型值中使用datepicker只是一个simpletextbox文本框 我一直在尝试这个:

@ Html.TextBox(“fechaInicio”,“”,new {@class =“datefield”})

但不行 我赞成任何帮助

更新

我必须更详细地解释我的问题 我有一个

class Foo{

   private stirng name;
   private DateTime dateOfBirthday;
}

在Foo视图中我正在编辑list.cshtml,所以我可以通过dateOfBirthday搜索from到。 所以我想制作两个文本框,以便用户可以从日期到日期范围选择日期时间选择器。 我想使用模板,以便我可以重复使用它。 但是list.cshtml视图已经输入到@Model Foo 但是这两个文本框不是模型字段

EditTemplate我已经完成了对模型类型@EditorFor filds的完美工作,所以我试图在我的日期范围文本框中使用

对于我所读到的内容,我可以创建一个EditorTemplate,但这并不意味着我可以随处使用我可以在我想要的地方使用

非常感谢

4 个答案:

答案 0 :(得分:1)

从设计的角度来看,不要做非模特的事情。创建视图模型,其中包含视图需要显示的所有内容并回发到控制器,因此您可以在一个类中获得所需的一切。这种强类型类更容易使用。

关于具体问题,为了使用编辑模板,您需要做的就是在以下层次结构中创建文件夹EditorTemplatesViews/<ControllerName>/EditorTemplates 并将<TypeYouWantToUseThisEditorTemplate>.cshtml置于编辑器模板文件夹中,并将@model <<TypeYouWantToUseThisEditorTemplate>作为该编辑器模板中的第一行。

指向编辑器模板的链接是属性的类型。例如,如果在模型中您具有类型MyType的属性,则需要将编辑器模板调用MyType.cshtml。 这就是你所要做的一切。

这也适用于基本类型,因此如果您在编辑器模板文件夹下创建文件string.cshtml,那么您的视图所使用的任何字符串都将转到该编辑器模板。

注意如果您的编辑器模板将用于多个视图和控制器,您可以在/Views/Shared/EditorTemplates下创建编辑器模板,以便在应用程序之间共享。

有关编辑器模板的更多信息,请访问:ASP.NET MVC 3 – How to use EditorTemplates

希望这有帮助。

<强>更新

根据您的要求,这里是与视图模型一起使用的编辑器模板的简单示例(让您了解整个构造的工作原理)

查看型号:

public class Book
{
  public int BookId { get; set; }
  public string BookName { get; set; }
  public string Description { get; set; }
}

EditorTemplate名为Book.cshtml,位于/Views/<ControllerName or Shared/EditorTemplates

@model <MyAppName>.Models.Book

@Html.DisplayFor(p => p.BookId)
@Html.EditorFor(p => p.BookId)

@Html.DisplayFor(p => p.BookName)
@Html.EditorFor(p => p.BookName)

@Html.DisplayFor(p => p.Description)
@Html.EditorFor(p => p.Description)

没有错误处理,没有验证,为简洁起见,在此编辑器模板中没有做任何事情。

使用类型为Book的编辑器模板的查看页面根本不起作用(所有工作都将由编辑器模板完成):

@Html.EditorFor(model => model.Book) 

答案 1 :(得分:1)

您可以使用ViewModel来帮助您

有时候,当您使用EF(实体框架)中的模型或其他具有重要属性的持久性感知类时,他们可以节省您的一天并将其视为最佳实践,这些类具有用户无法在帖子上更改的重要属性示例

这样的事可能会对你有所帮助:

public class FooSearchViewModel
{
    public Foo Foo { get; set; }
    public DateTime From { get; set; }
    public DateTime To { get; set }
}

然后,您必须将视图绑定到此ViewModel而不是模型,并使用它:

Name: @Model.Foo.name
From: @Html.EditorFor(model => model.From, "DateWithCalendar")
To: @Html.EditorFor(model => model.To, "DateWithCalendar")

模板可以通过EditorTemplate来实现,就像他的回答中解释的@Display名称一样:

<强> /Views/Shared/EditorTemplates/DateWithCalendar.cshtml

@model System.DateTime
@Html.TextBoxFor(model => model.Date, new { class = "date datepicker" })

然后你可以使用CSS来自定义输入并将jQuery UI日期选择器应用于它或者你喜欢什么。

您还可以定义用于ViewModel中的DataAnnotations属性的模板:

[UIHint("DateWithCalendar")]
public DateTime From { get; set; }

<强>参考文献:

http://blogs.msdn.com/b/simonince/archive/2010/01/26/view-models-in-asp-net-mvc.aspx
http://kazimanzurrashid.com/posts/asp-dot-net-mvc-viewmodel-usage-and-pick-your-best-pattern
ViewModel Best Practices

答案 2 :(得分:0)

尝试使用部分视图:

@* Views\Shared\_HandlingMyString.cshtml *@
@model string
This is my partial view to handle the string: '@Model'

您将从主视图中以这种方式调用它(我认为这是您正在寻找的链接):

@model MyType // that has public string MyProperty that holds your date (start and end)
@Html.Partial("_HandlingMyString", Model.MyProperty)

这些方面的东西。你可能需要做一些修改,我没有编译这个代码,但它是你似乎需要的。

如果有帮助,请告诉我。

答案 3 :(得分:0)

rcdmk提出的解决方案完成了这项工作。 我认为polutae是一个搜索类的类是正确的方法。 我认为使用ASP.net MVC我们必须使用字符串类型视图作为显示名称指向。 谢谢你的帮助。