1

我有以下情况。

我正在开发一个 MVC 3 asp.net 应用程序。我想用日期时间范围过滤器制作一个搜索表单。我想使用日期选择器,以便用户可以选择日期范围。我已经按照这个 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,我会放一些代码让你明白我的意思。

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

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

如果我在我看来使用这条线一切正常

@Html.EditorFor(m => m.fecha_Modificacion,"日期")

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

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

但不工作我会感谢任何帮助

更新

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

class Foo{

   private stirng name;
   private DateTime dateOfBirthday;
}

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

EditTemplate 我在模型类型为@EditorFor filds 上完美工作,所以我试图在我的从到日期范围文本框上使用

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

非常感谢

4

4 回答 4

1

You can use a ViewModel to help you

Sometimes they can save your day and its considered a best practice to use them when you are using models from EF (Entity Framework) or other persistance aware classes that have important properties that can't be changed by the user on post for example.

Something like this may help you:

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

Then, you have to bind the view to this ViewModel instead of the model and use it like:

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

The template can be archieved with a EditorTemplate, like the one @Display Name explained in his answer:

/Views/Shared/EditorTemplates/DateWithCalendar.cshtml

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

Then you can use CSS to customize the input and apply the jQuery UI datepicker to it or wethever you like.

You can also define the template to use with DataAnnotations attributes in the ViewModel:

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

References:

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

于 2012-08-14T23:44:46.570 回答
1

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

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

编辑器模板的链接是属性的类型。例如,如果模型中有 type 属性,则MyType需要调用编辑器模板MyType.cshtml。这就是你所要做的。

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

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

更多关于编辑器模板的信息:ASP.NET MVC 3 – 如何使用 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) 
于 2012-08-14T22:24:29.070 回答
0

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

于 2012-08-15T14:42:05.253 回答
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)

沿着这些思路。你可能需要做一些微调,我没有编译这段代码,但它是你似乎需要的。

请让我知道这可不可以帮你。

于 2012-08-14T23:45:41.323 回答