3

ASP.NET MVCとCodebehind-filesについては多くの議論がありましたが、ほとんどの場合、これらのCodebehind-filesは悪であると指摘されています。

だから私の質問は、ページ固有のロジックをどのように処理するのですか?

ここで必要ないのは、インラインコード内のスパゲッティコードであり、ページ固有のコードがヘルパークラス全体またはHTMLヘルパークラスの上に散在することは望ましくありません。

例は次のとおりです。

<% for(int i = 0; i < companyList.Count; i++) { %>
    RenderCompanyNameWithRightCapsIfNotEmpty(company, i)
<% } %>

コードビハインドを伴う:

private string RenderCompanyNameWithRightCapsIfNotEmpty(string company, index)
{
    if (index == 0) {
        return string.Format("<div class=\"first\">{0}</div>", company);
    }
    // Add more conditional code here
    // - page specific HTML, like render a certain icon
    string divClass = (index % 2 == 0) ? "normal" : "alternate";
    return string.Format("<div class=\"{1}\">{0}</div>", company, divClass);
}

これは1ページでのみ使用され、変更される可能性があります。

更新:これらがどこにあるかについて私が考えたいくつかのアプローチ:

1)ページの後ろにあるインラインコード-文字列を返す単純なメソッドを使用します。

<script runat="server">
    private string RenderCompanyHtml(string companyName) ...
<script>

2)文字列を返すメソッドをコントローラに配置します。しかし、それはView-logicをControllerに入れることになるでしょう。

public class SomeController : Controller 
{
    [NonAction] 
    private static string RenderCompanyHtml(string companyName) ...

    public ActionResult Index() ...
}
4

3 に答える 3

3

ビューデータを準備するcontrolleractionにそのコードを配置する必要があります。

私は通常、物事をきれいに保つために、いくつかの[NonAction]メソッドを使用してコントローラークラスにリージョン「ヘルパーメソッド」を作成します。

したがって、私の(簡略化された)コントローラーは次のようになります。

public class SomeController : Controller 
{
  #region Helper methods
  [NonAction] 
  private static string CompanyNameWithRightCapsIfNotEmpty(string company)
  {
    if (string.IsNullOrEmpty(company)) {
        return company;
    }
    return UpperCaseSpecificWords(company);
  }

  #endregion

  public ActionResult Companies()
  {
    var companies = GetCompanies();
    var companyNames = companies.Select(c =>  CompanyNameWithRightCapsIfNotEmpty(c.Name));
    ViewData["companyNames"] = companyNames;
    return view();
  }
}
于 2009-06-01T08:09:31.923 に答える
2

ヘルパーメソッドは、ページ固有のコードを処理するための1つの優れた方法ですが、必要なデータをモデルに表示させることが望ましいと思います。

ヘルパーオプションを選択する場合は、実行する操作をページ固有のものより少し少なくすることで、より適切にサービスを提供できます。メソッドRenderCompanyNameWithRightCapsIfNotEmptyを非常に具体的にする必要がある場合は、モデルで提供されている方がよいでしょう。1つの方法は、モデルに既にフォーマットされたテキストを含むリストを提供させ、それをパブリックプロパティ(フォーマットされた会社名のIEnumerableなど)として公開することです。

于 2009-06-01T08:18:59.720 に答える
1

HTMLヘルパーを使用します。

同様に、staticクラスにヘルパーメソッドを作成します。

    public static string Label(this HtmlHelper helper, string target, string text)
    {
        return String.Format("<label for='{0}'>{1}</label>", target, text);
    }

..次に、ビューで使用します。

<span><% =Html.Label("FinishDateTime.LocalDatetime", "Finish Time:")%><br />

RenderCompanyName(string[] companies)nullをチェックし、キャップを操作し、その間にhtmlをレンダリングする、多分と呼ばれるヘルパーメソッドを作成できます。必要に応じて、すべて同じヘルパーで実行できます。

また、コントローラーのアクションメソッドは軽量である必要があります。データを取得してビューを返すだけです。プレゼンテーション用のデータの操作などをビューやHtmlヘルパーに委任する必要があります。

編集:ここにあなたが求めているかもしれないヘルパーがあります:

このヘルパーはIList<>、順序付けされていないリストの形式でhtmlをレンダリングします<ul>...</ul>。これの便利な点は、cssを介してリストをレンダリングする方法を制御できること、各アイテムに追加のhtml/コンテンツをレンダリングできることです。見てください-これはヘルパーです:

    public static string UnorderedList<TItem>(this HtmlHelper helper,
        IList<TItem> items, Func<TItem, string> renderItemHtml,
        string ulID, string ulClass, string liClass)
    {
        StringBuilder sb = new StringBuilder();

        // header
        if (!ulID.IsNullOrTrimEmpty()) sb.AppendFormat("<ul id='{0}'", helper.Encode(ulID.Trim()));
        else sb.AppendFormat("<ul");
        if (!ulClass.IsNullOrTrimEmpty()) sb.AppendFormat(" class='{0}'>", helper.Encode(ulClass.Trim()));
        else sb.AppendFormat(">");

        // items
        foreach (TItem i in items)
        {
            if (!liClass.IsNullOrTrimEmpty())
                sb.AppendFormat("<li class='{0}'>{1}</li>", helper.Encode(liClass.Trim()),
                    renderItemHtml(i));
            else
                sb.AppendFormat("<li>{0}</li>", renderItemHtml(i));
        }

        // footer
        sb.AppendFormat("</ul>");

        return sb.ToString();
    }

..それを使用するのは簡単です。タグのリストをレンダリングする簡単な例を次に示します。

    <div id="tags">
        <h2>Tags</h2>
        <%=Html.UnorderedList<Tag>(Model.Tags.Tags,tag=>
            {
                return tag.Name;
            },null,null,null) %>
    </div>

..私の使用例では、cssまたはid属性を指定しないことを選択しTag、匿名のデリゲートを使用してアイテムの名前を返すだけであることがわかります。匿名の代理人は非常に使いやすいです。あなたの場合、おそらくこのようなものが機能するでしょう:

    <div id="tags">
        <h2>Tags</h2>
        <%=Html.UnorderedList<string>(ViewData["companies"],company=>
            {
                if (someCondition) return company.ToUpper();
                else return company;
            },null,null,null) %>
    </div>

..ViewData["companies"]IList<string>単純化のためです。

于 2009-06-01T08:15:04.313 に答える