2011-08-01 19 views
5

Tôi đoán những gì tôi muốn làm là "chuỗi" dữ liệu của tôi xuống để nó kết thúc lên trông giống nhau. Tất cả html của tôi phải được bọc trong một số hình thứcRazor Helpers chia sẻ vấn đề html với các khối mã

<fieldset class="" data-role=""> 

Vì vậy, những gì tôi có là một helper mà in các hình thức khác nhau. Một nhãn sẽ là nhãn:

<fieldset data-role="@role"> 
    <label>@Html.Raw(label)</label> 
</fieldset> 

Bây giờ khi tôi có nhiều loại nhãn và một nhãn bao gồm một khối mã. Khi nó là một mảnh đơn giản của văn bản, như "Tên" Tôi làm:

@FieldSet.Label("First Name") 

Nhưng khi tôi có một khối mã như:

<b>some text</b> 
<p>some other text (some time frame - some time frame) 

Nó trở nên phức tạp để sử dụng này:

@FieldSet.Label("<b>" + Model.Text1 + "</b><p>" + Model.Text2 + 
    " (" + Model.Time1 + " - " + Model.Time2 +")</p>") 

Những gì tôi muốn nó là một giải pháp mà trông giống như sau:

@FieldSet.Label(@<text> 
<b>@Model1.Text1</b> 
<p>@Model.Text2 (@Model.Time1 - @Model.Time2)</p> 
</text>) 

Tôi đã đọc ở đâu đó điều này là có thể, nhưng tôi không thể tìm thấy bài viết. Tôi có thể hoàn toàn bị nhầm lẫn, nhưng tôi thực sự không muốn có một đoạn mã HTML duy nhất trong mã phía sau và tôi muốn sử dụng cú pháp dao cạo, chứ không phải nối chuỗi.

+0

Tôi không thích bất kỳ giải pháp nào mặc dù chúng là câu trả lời đúng. Tôi sẽ bắt đầu một chủ đề mới cho "Thực hành tốt nhất" thay vào đó, có lẽ tôi sẽ nhận được một câu trả lời tôi có thể sử dụng ở đó. – BradLaney

Trả lời

4

Kiểm tra bài viết này từ Phil Haack

Bạn có thể:

Viết như một phương pháp mở rộng cho một HtmlHelper mạnh mẽ-gõ:

public static class RazorExtensions 
{ 
    public static HelperResult Label<T>(this HtmlHelper<T> helper, Func<T, HelperResult> template) { 
     return new HelperResult(writer => { 
      writer.Write("<label>"); 
      template(helper.ViewData.Model).WriteTo(writer); 
      writer.Write("</label>"); 
     }); 
    } 
} 

Vì vậy, bạn có thể viết

@Html.Label(@<text><span>@Model.Item1<span><strong>@Model.Item2</strong></text>) 

đèo mẫu như một tham số cho phương thức helper bạn

public static class FieldSet 
{ 
    public static HelperResult Label<T>(this T model, Func<T, HelperResult> template) { 
     return new HelperResult(writer => { 
      writer.Write("<label>"); 
      template(model).WriteTo(writer); 
      writer.Write("</label>"); 
     }); 
    } 
} 

Cách sử dụng:

@FieldSet.Label(Model, @<div><span>@Model.UserName</span><strong>@Model.FullName</strong><p>@Model.Description</p></div>) 
+0

đọc tốt nhưng vẫn gặp vấn đề thực sự làm cho nó hoạt động. triển khai của họ không hỗ trợ mã chia sẻ. chỉ thay đổi trong vòng lặp, đó không phải là vấn đề của tôi. – BradLaney

+0

có vẻ như tôi sẽ phải sử dụng các đối tượng động, cũng là một điều xấu. Tôi phải có người trợ giúp của tôi chấp nhận một Func <> và TModel của tôi và chuyển mô hình cho Func <> và làm item thay thế cho Model trong cshtml – BradLaney

+0

Đây có phải là điều bạn mong đợi tôi kết thúc không? Nhãn '@helper (mẫu Func <động, HelperResult>, mô hình động, vai trò DataRole = DataRole.fieldcontain) { @Label (vai trò, mẫu.Invoke (mô hình) .ToString()); } @ FieldSetHelper.Label (@ Phản hồi của tôi: @ item.Answer (@ item.AnsweredOn), câu hỏi) ' – BradLaney

3

Bạn có thể nhìn vào cách @Html.BeginForm được thực thi.

Tạo một lớp mà thực hiện IDisposable, và ghi vào dòng đáp ứng trực tiếp:

Mã của bạn có thể trông như thế này (nhập vào bởi người đứng đầu, không kiểm tra):

class FieldSet : IDisposable { 
    public FieldSet(string label) { 
      // TODO: Encode label on line below 
      HttpContext.Current.Response.Write(string.Format("<fieldset><label =\"{0}\"", label)); 
    } 

    public void Dispose() { 
     HttpContext.Current.Response.Write("</fieldset>"); 
    } 
} 

static class FieldSetExtionsions { 
    public static FieldSet FieldSet(this HtmlHelper html, string label) { 
     return new FieldSet(label); 
    } 
} 

Việc sử dụng sẽ :

@using (Html.FieldSet("your label")) { 
    <div> 
     Your razor code goes here 
    </div> 
} 
+0

Điều này chắc chắn có vẻ như là cách tiếp cận tốt nhất với tôi; sau khi tất cả, một fieldset là nghĩa vụ đóng gói một tập hợp các lĩnh vực. –

Các vấn đề liên quan