【问题标题】:Html.BeginForm css properties without action and controller没有动作和控制器的 Html.BeginForm css 属性
【发布时间】:2012-12-12 05:56:41
【问题描述】:

我的控制器中有 2 个操作,创建和编辑,它们本质上使用相同的视图,因为添加和编辑记录的功能是相同的。

所以在我看来,我有这个:

@using (Html.BeginForm("Create", "Customers", FormMethod.Post, new { @class = "form-horizontal" }))

我可以使用@using (Html.BeginForm()) { }

但是那样,我看不到任何重载方法可以添加到我的 css 类文件中

如何在创建和编辑操作中使用相同的 BeginForm 帮助器,而无需对其进行硬编码?

或者,如果我想为我的表单标签设置样式,应该采用哪些其他方式或最佳实践,该样式将用于 2 个不同的操作。

【问题讨论】:

    标签: c# css asp.net-mvc html-helper


    【解决方案1】:

    我和你做了同样的事情,两个动作都用一个视图。在控制器中,我只传递了一个 ViewBag 属性,称为 Action,它是根据上下文设置的。在视图中,只需调用@Html.BeginForm(ViewBag.Action, ...)。

    【讨论】:

    • 您也可以检查模型是否为空,例如:BeginForm(Model == null ? "Create" : "Edit", ...)
    【解决方案2】:

    最好的选择是创建一个 css 文件并将其包含在视图布局中。

    <link href="**.css" rel="stylesheet" type="text/css" />
    

    内部css:

    form {
            background-color: #fff;
            margin: 0;
            padding: 0;
        }
    

    【讨论】:

      【解决方案3】:

      尽管为两者重复使用相同的视图似乎是个好主意,但我可以告诉您,最终您将不得不将它们拆分,通常是由于请求的某些新功能仅适用于其中一个或另一个.练习为“编辑”和“创建”提供专用视图是一个好主意。在这和保持它们 DRY 之间的一个很好的折衷是让视图包含开始表单标记,如果需要,可能是一些 JavaScript 或任何其他引用,但是对于字段本身,使用 @Html.EditorFor() 并为该数据类型创建一个 EditorTemplate。这样它仍然尽可能地保持 DRY 原则,但仍然让你坚持单一责任原则。当然,如果它们确实变得更加复杂,那么共享的 EditorTemplate 可能也需要更改,在这种情况下,您将来可能也需要拆分它并使用类似@Html.EditorFor(x=&gt;x, "CustomerEdit")

      一般来说,让控制器决定视图的关注点(生成表单 URL)是一种不好的做法。

      视图/客户/Create.cshtml

      @using (Html.BeginForm("Create", "Customers", FormMethod.Post, new { @class = "form-horizontal" }))
      {
          @Html.EditorFor(x=>x)
      }
      

      视图/客户/Edit.cshtml

      @using (Html.BeginForm("Edit", "Customers", FormMethod.Post, new { @class = "form-horizontal" }))
      {
          @Html.EditorFor(x=>x)
      }
      

      视图/客户/EditorTemplates/Customer.cshtml

      <div class="control-group">
          <label class="control-label">@Html.DisplayNameFor(model => model.Name)</label>
          <div class="controls">
              <span class="text">
                  @Html.EditorFor(model => model.Name)
              </span>
          </div>
      </div>
      <div class="control-group">
          <label class="control-label">@Html.DisplayNameFor(model => model.PhoneNumber)</label>
          <div class="controls">
              <span class="text">
                  @Html.EditorFor(model => model.PhoneNumber)
              </span>
          </div>
      </div>
      ...etc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2012-11-24
        • 2014-09-22
        • 2010-10-25
        相关资源
        最近更新 更多