如何简化此代码Kludge

时间:2009-07-24 17:33:32

标签: asp.net-mvc

输入:

Id, PartId, Name
1, 1, Head
1, 2, body
1, 3, Tail
2, 1, Head
2, 2, Leg

输出显示:

- Head, Body, Tail [Delete(1)]
- Head, Leg [Delete(2)]

我的代码:

<ol>
<% 
    int prev = -1;
    foreach (var item in t)
    { 
        if(prev != item.ResponseId){
            if (prev != -1)
            {%>
                <%= Html.ActionLink("[replacethis]", "RemoveResponse", new { id = item.ResponseId })
                .Replace("[replacethis]", "<img src=\"../../Content/images/delete_icon.gif\" class=\"borderlessImage\" title=\"Remove\"/>")%>      
                </li>  
            <%} %>
            <li>
            <% }
        else {
            %>, <%
        } %>

      <%= Html.Encode(item.ResponsePartValue) %>   

    <% prev = item.ResponseId;
    }  %>

     <%= Html.ActionLink("[replacethis]", "RemoveResponse", new { id = prev })
                .Replace("[replacethis]", "<img src=\"../../Content/images/delete_icon.gif\" class=\"borderlessImage\" title=\"Remove\"/>")%>      
                </li> 
</ol>

问题:

  1. 有什么方法可以重构这个?
  2. 我失踪的任何MVC技巧?

2 个答案:

答案 0 :(得分:1)

好吧,首先你可以创建一个为你呈现图片链接的HtmlHelper,而不是先生成锚标签,然后用图片替换它们的内容。

看看here

每次您需要输出一些文字时,您也不必使用<%=。如果您已经有开放代码块(即<%),那么您可以使用Response.Write方法输出您想要的内容。在像你这样的情况下,这看起来很可能比%> <%=更好。

尽管如此,我承认我并不完全知道你在这里列出的内容以及你希望它如何展示。但是按照你的算法,我想这就是我要做的:

<ol>
<% 
    int prev = -1;
    foreach (var item in t) { 
        if(prev != item.ResponseId) {
            if (prev != -1) {
                Response.Write(Html.ImageLink("../../Content/images/delete_icon.gif", "RemoveResponse", new { id = item.ResponseId, @class ="borderlessImage", title = "Remove" }) + "</li>");
            }
            Response.Write("<li>");
        }
        else {
            Response.Write(", ");
        } 
        prev = item.ResponseId; 
        Response.Write(Html.Encode(item.ResponsePartValue));
    }  %>

     <%= Html.ImageLink("../../Content/images/delete_icon.gif", "RemoveResponse", new { id = prev, @class ="borderlessImage", title = "Remove" }) %>
     </li> 
</ol>

答案 1 :(得分:0)

我会将所有内容放入字典中,这会使您的逻辑更符合逻辑: - )

类似的东西:

IDictionary<int, List<Part>> partsDictionary = new Dictionary<int, List<Part>>();

如果int键是您的id,那么List类型的值将是您的各个部分。

然后将逻辑放入HtmlHelper扩展名。

E.g。 (虽然我不知道你在做什么,查看代码与你顶部的db模型不匹配。这应该给你一个想法)

public static string PartsList(this HtmlHelper html, IDictionary<int, List<Part>> partsDictionary)
{
    if (partsDictionary.Count == 0)
        return "";

    StringBuilder toReturn = new StringBuilder("<ol>");
    foreach (KeyValuePair<int, List<Part>> kvp in Model.PartsDictionary)
    {
        toReturn.Append("<li>");

        //Individual part links
        IList<string> partsLinks = new List<string>();
        foreach (Part part in kvp.Value)
            partsLinks.Add(html.ActionLink(part.PartName, "ActionName", new { @id = part.Id }));

        toReturn.Append(string.Join(", ", partsLinks.ToArray()));

        //Part category(?) link
        toReturn.Append(html.ActionLink("Delete", "ActionName", new { @id = kvp.Key }));

        toReturn.Append("</li>");
    }

    toReturn.Append("</ol>");
    return toReturn.ToString();
}

或类似的东西; - )

HTHS
查尔斯