【问题标题】:ASP.NET MVC 2 editor template for value types, int值类型的 ASP.NET MVC 2 编辑器模板,int
【发布时间】:2009-08-03 16:44:15
【问题描述】:

我想为值类型(即 int )创建一个 MVC 2 编辑器模板,有人用预览 1 位做过吗?

非常感谢

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    当您在回发时提交值时,尼克克拉克的答案是否有效?

    在 MVC2 预览 2 中,调用 Html.Textbox("abc", Model.ToString()) 将呈现一个带有“.abc”附加到名称的文本框,例如

    <input id="StartDate_abc" name="StartDate.abc" type="text" value="02 Feb 09" />
    

    这会在您回发并尝试 UpdateModel() 时导致问题。

    我为 DateTime 做了一个编辑器模板,以下对我有用:

    /Views/Shared/EditorTemplates/DateTime.ascx:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime>" %>
    <%= Html.TextBox(String.Empty, Model.ToString("dd MMM yy")) %>
    

    或者,为所有的 DateTimes 使用 jQuery 的 DatePicker 将 jQuery 和 jQueryUI 的引用添加到您的 Masterpage 或包含对 EditorFor 的调用的视图。

    /Views/Shared/EditorTemplates/DateTime.ascx:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime>" %>
    <%= Html.TextBox("", Model.ToString("dd MMM yy")) %>
    <script type="text/javascript">
        $("#<%= ViewData.ModelMetadata.PropertyName %>").datepicker({ dateFormat: 'dd M y' });
    </script>
    

    更新:ASP.NET MVC3,使用 Razor 语法:

    @model System.DateTime
    @Html.TextBox("",  Model.ToString("dd MMM yy"))
    <script type="text/javascript">
        $("#@ViewData.ModelMetadata.PropertyName").datepicker({ dateFormat: 'dd M y' });
    </script>
    

    要在视图中使用它,您只需要:

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

    -马特

    【讨论】:

      【解决方案2】:

      我还没有尝试过预览 1,但他们在这个 channel9 视频中做到了你所要求的:

      http://channel9.msdn.com/posts/Glucose/Hanselminutes-on-9-ASPNET-MVC-2-Preview-1-with-Phil-Haack-and-Virtual-Scott/

      他们同时执行 DisplayFor 和 EditorFor,大约 2 分钟开始。

      --编辑--

      对于值类型,即 int,我能够让它以相同的方式工作。

      创建一个模型以传递给我的视图:

      public class HomeController : Controller
      {
          public ActionResult Index()
          {
              HomeModel model = new HomeModel();
              model.message = "Welcome to ASP.NET MVC!";
              model.number = 526562262;
              model.Date = DateTime.Now;
      
              return View(model);
          }
      }
      
      public class HomeModel
      {
          public string message { get; set; }
      
          public int number { get; set; }
      
          public DateTime Date { get; set; }
      }
      

      使用新的模板逻辑将视图链接到模型:

      <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<HomeModel>" %>
      
      <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
      <p>
          <% Html.EditorFor(c => c.message); %>
      </p>
      <p>
          <% Html.EditorFor(c => c.number); %>
      </p>
      <p>
          <% Html.EditorFor(c => c.Date); %>
      </p>
      

      然后为每种类型创建一个模板,例如Int32:

      <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
      Editor For My Int32: <%= Html.TextBox("abc", Model.ToString())%>
      

      我把它放在 Views\Shared\EditorTemplates\Int32.ascx 中

      【讨论】:

      • 视频展示了基于引用类型(字符串)而非值类型创建编辑器模板。
      • dean:我改进了我的答案,但我刚刚在发行说明中注意到值类型存在一个已知问题。它似乎对我有用,所以不确定这与什么有关。
      • 谢谢尼克,我在页面声明中声明了值类型,例如Inherits="System.Web.Mvc.ViewUserControl" 根据您的示例,删除它可以解决问题。感谢您的所有帮助
      • 我认为 必须是引用类型,因此对于 DateTime 或 int 等值类型,您不能这样做。
      【解决方案3】:

      我已经写了 a blog post 关于如何通过在 MVC 2 中创建可重用模板来做到这一点。

      我的帖子也解释了TemplateInfo和模板的关系。

      【讨论】:

        【解决方案4】:

        我发现布拉德威尔逊的blog 有最好的例子和解释。该系列的Part-3 专门讨论了值类型(字符串、十进制、Int32)。

        享受吧!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-17
          • 1970-01-01
          相关资源
          最近更新 更多