我正在尝试在我的项目中使用persian datetimepicker
。我正在使用MVC4。
所以我找到了一个链接http://stackoverflow.com/questions/16248909/persian-calender-in-mvc-asp-net
,我决定实现这个。
我在我的项目中添加了一些css and js
文件,如您所见(我添加到我的布局页面):
<link href="@Url.Content("~/Content/js-persian-cal.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/js-persian-cal.min.js")"></script>
所以我在这里创建了一个模型:
namespace MvcApplication2.Models
{
public class DTpicker
{
public string name { set;get;}
public DateTime datetime { set; get; }
}
}
我在这里创建了一个视图create view
:
@model MvcApplication2.Models.DTpicker
@{
ViewBag.Title = "create";
}
<h2>create</h2>
<script type="text/javascript">
var objCal1 = new AMIB.persianCalendar('pcal1'); </script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>DTpicker</legend>
<div class="editor-label">
@Html.LabelFor(model => model.name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.name)
@Html.ValidationMessageFor(model => model.name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.datetime)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.datetime, new { @id = "pcal1", @class = "pdate" })
@Html.ValidationMessageFor(model => model.datetime)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
正如您所看到的,我在日期时添加了一些额外的代码,如您所见:
@Html.EditorFor(model => model.datetime, new { @id = "pcal1", @class = "pdate" })
我将这部分代码添加到了创建视图中,如上所示:
<script type="text/javascript">
var objCal1 = new AMIB.persianCalendar('pcal1'); </script>
所以但问题出在哪里,当我运行我的应用程序时,datetimepicker不起作用。我使用浏览器看到了页面的视图源,我的日期时间输入有这样的语法:
<div class="editor-label">
<label for="datetime">datetime</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-date="The field datetime must be a date." data-val-required="The datetime field is required." id="datetime" name="datetime" type="datetime" value="" />
<span class="field-validation-valid" data-valmsg-for="datetime" data-valmsg-replace="true"></span>
</div>
如您所知,ID应为pcal1
,但您可以看到ID为id="datetime"
为什么?
任何想法都将受到赞赏
答案 0 :(得分:2)
EditorFor
不支持传递HTML属性。所以你通过的对象并没有做任何事情。 (实际上,它正在做某些而不是你所期望的。它会在ViewData
中设置这些值的键,例如ViewData["id"] = "pcal1"
。)id被设置为{{ 1}}因为这是您为其创建编辑器的属性的名称。
所以,你有两个选择:
请勿使用datetime
,而应使用EditorFor
之类的内容。这将允许您传递HTML属性以在输入上呈现:
TextBoxFor
创建用于@Html.TextBoxFor(model => model.datetime, new { type="datetime", @id = "pcal1", @class = "pdate" })
属性的编辑器模板:
<强>视图\共享\ EditorTemplates \ DateTime.cshtml 强>
DateTime
然后在你看来:
@{
var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"] ?? new {});
htmlAttributes["type"] = "datetime";
htmlAttributes["class"] = htmlAttributes["class"] == null
? "pdate"
: "pdate " + htmlAttributes["class"];
}
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttributes)
请注意,模板正在添加@Html.EditorFor(model => model.datetime, new { htmlAttributes = new { id = "pcal1" } })
类,因此您不必手动传递它。我假设这是您的JavaScript所附加的内容,因此您希望此类始终存在于pdate
属性的输入中。另请注意DateTime
调用的语法。您需要传递一个由EditorFor
组成的匿名对象,而不是传递由id
组成的匿名对象,而htmlAttributes
本身就有一个id
。这是因为EditorFor
再次设置ViewData
中的值。